Комбинирование двух 32-битных чисел в одно 64-разрядное целое число


long long combine(unsigned int high, unsigned int low) {
    return ((unsigned long long) high) << 32 || low;
}
  1. Есть ли лучшее название для операции?
  2. Это неявное приведение из неподписанных долго долго на долго на оператора reinterpret_cast, или что произойдет, если беззнаковое число слишком велико для подпись тип данных?


4599
7
задан 25 мая 2011 в 04:05 Источник Поделиться
Комментарии
1 ответ

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

Я бы предпочел имя, такое как u32tou64, uinttoull, или что-то более описательное, чем сочетать. Многое из этого будет зависеть от ваших собственных стандартов именования, хотя.

Кроме того, я считаю более педантичны:

return (((uint64_t) high) << 32) | ((uint64_t) low);

Это вряд ли изменит, потому что код по сути такой же как у тебя, но это легче читать и избегает крайне редко (но очень хлопотно для отладки) проблем литья. Это может потребовать заголовка пользовательских типов, если ваш компилятор не поддерживает этот тип нотации.

Кроме того, можно сделать макрос. Есть мало выгод для включения функции - сама операция займет гораздо меньше времени, чем функция настройки вызова, и вернуться, поэтому выполнение макроса будет гораздо выше. Кроме того, он не собирается занимать гораздо больше места, чем программы вызов функции, так что мало получить, оставив ее настоящая функция.

8
ответ дан 25 мая 2011 в 05:05 Источник Поделиться