3

将 64 位常量分配为

int64_t foo = 0x1234LL;

不可移植,因为long long 不一定int64_t. 这篇文章哪个初始化程序适合 int64_t?讨论了INT64_C()宏 from的使用<stdint.h>,但是否也可以使用static_castas

int64_t foo = static_cast<int64_t>(0x1234);

?

我应该更喜欢哪一个,为什么,或者它们都运作良好?

我在互联网和 SO 上进行了搜索,但没有找到任何static_cast探索该选项的地方。我还进行了测试,sizeof()以确认它在简单的情况下有效。

4

1 回答 1

6

实际上,long longC 实现限制标头保证至少为 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
...    | ...               | ...
于 2013-02-10T14:33:02.163 回答