расщепление долго долго - PullRequest
3 голосов
/ 12 апреля 2011

Как можно "разбить", то есть тип long long, чтобы первая его часть была в var типа long, а вторая часть также в var типа long.

long long long_type = 0xaaaabbbbccccdddd;

и в первом int я хотел бы иметь первую половину (неважно с какой стороны) переменной long_type и во второй половине int второй половине.

Ответы [ 4 ]

6 голосов
/ 12 апреля 2011

Ваш вопрос неоднозначен. Это зависит от того, что вы подразумеваете под «раскол». Вы можете разделить представление значения вашего исходного long long или разделить представление объекта вашего long long.

Если вы хотите разделить представление значения, то ваш вопрос еще более неоднозначен из-за того, что ваше первоначальное значение подписано . Как вы собираетесь разделить подписанное значение? Какой результат вы ожидаете? Подпись? Unsigned? Часть старшего разряда подписана, часть младшего разряда не подписана? Или что-то еще?

Для значения без знака это будет выглядеть следующим образом (при условии, что тип получателя long имеет правильный размер для ваших целей)

unsigned long long long_type = ...;

unsigned long hi = long_type / ULONG_MAX;
unsigned long lo = long_type;

Если вы хотите разделить представление объекта, правильный способ сделать это будет использовать memcpy (в этом случае подпись исходного значения не имеет значения)

long long long_type = ...;

unsigned long hi, lo;

memcpy(&lo, &long_type, sizeof lo);
memcpy(&hi, (char *) &long_type + sizeof lo, sizeof hi);

В этом случае, конечно, какая часть на самом деле младшая, а какая - старшая, будет зависеть от платформы.

5 голосов
/ 12 апреля 2011

Я бы рекомендовал использовать uint32_t и uint64_t или другие типы фиксированной ширины.

Затем использовать битовые операции, чтобы разделить его следующим образом:

uint64_t long_type = smthng;
uint32_t high = (long_type & 0xFFFFFFFF00000000ULL) >> 32;
uint32_t low = long_type & 0xFFFFFFFF;
1 голос
/ 12 апреля 2011
long a = long_type;
long b = (static_cast<unsigned long long>(long_type) >> 32);
0 голосов
/ 12 апреля 2011

Вот пример того, что не делать, если вы хотите переносимость:

union MyUnion
{
    long long n64;
    struct
    {
        long lo32;
        long hi32;
    };
};

MyUnion u;
u.n64 = 0xaaaaaaaabbbbbbbb;
long lo = u.lo32; // 0xaaaaaaaa
long hi = u.hi32; // 0xbbbbbbbb

Этот союз не будет работать на машинах с прямым порядком байтов.Жаль, хотя;Мне скорее нравится синтаксис.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...