Назначение 64-битной константы как
int64_t foo = 0x1234LL;
не является портативным, потому что long long
не обязательно int64_t
, Эта почта Какой инициализатор подходит для int64_t? обсуждает использование INT64_C()
макрос из <stdint.h>
, но разве нельзя использовать static_cast
как
int64_t foo = static_cast<int64_t>(0x1234);
?
Какой из них я предпочитаю и почему, или они оба работают хорошо?
Я искал в Интернете и на SO, но не нашел ни одного места, где static_cast
вариант изучен. Я также сделал тесты с использованием sizeof()
чтобы подтвердить, что это работает в простых случаях.
На самом деле, long long
заголовок пределов реализации C гарантированно должен быть не менее 64 бит <climits>
, Минимальное ограничение на минимальное и максимальное значения для объекта типа long long
дается как:
LLONG_MIN -9223372036854775807 // −(2^63 − 1)
LLONG_MAX +9223372036854775807 // 2^63 − 1
Это соответствует 64-битному целому числу со знаком. Вы не можете хранить такой диапазон значений без как минимум 64 информационных битов.
Так что давай и использовать 0x1234LL
, Фактически, вы можете использовать суффикс точно так же, потому что будет выбран первый из следующих типов, которые могут соответствовать значению:
Suffix | Decimal constants | Octal or hexadecimal constant
-------|-------------------|------------------------------
none | int | int
| long int | unsigned int
| long long int | long int
| | unsigned long int
| | long long int
| | unsigned long long int
... | ... | ...
Других решений пока нет …