Должен ли я использовать static_cast или INT64_C для переноса 64-битной константы?

Назначение 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() чтобы подтвердить, что это работает в простых случаях.

3

Решение

На самом деле, 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
...    | ...               | ...
6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]