【问题标题】:Should I use static_cast or INT64_C to assign 64-bit constant portably?我应该使用 static_cast 还是 INT64_C 可移植地分配 64 位常量?
【发布时间】:2013-02-10 14:26:39
【问题描述】:

将 64 位常量赋值为

int64_t foo = 0x1234LL;

不可移植,因为long long 不一定是int64_t。这篇帖子Which initializer is appropriate for an int64_t? 讨论了<stdint.h>INT64_C() 宏的使用,但是否也可以将static_cast 用作

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

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

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

【问题讨论】:

  • 如果常量大于 64 位,静态转换不会做错事,什么都不说?

标签: c++ static-cast int64


【解决方案1】:

实际上,C 实现限制标头&lt;climits&gt; 保证long long 至少为64 位。 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
...    | ...               | ...

【讨论】:

  • 谢谢。如果 long long 超过 64 位,比如 128 位,该怎么办?我不记得标准是怎么说的。将较大的类型分配给较小的类型是否具有明确定义的行为? (当然,我正在考虑值适合 64 位的情况。)
  • @Deidara-senpai 在这种情况下,目标类型已签名,如果您尝试在int64_t 中设置更大的整数值,则结果将是未定义的。
  • 嗯,是的,我知道这一点,但如果该值适合 64 位,那么结果是否明确?
  • @Deidara-senpai 也许我很困惑,但当然,将一个适合 64 位的值分配给 int64_t 会非常好。
  • 好的,谢谢。我总是很难记住标准中的这些内容。
猜你喜欢
  • 1970-01-01
  • 2011-03-08
  • 2012-09-10
  • 1970-01-01
  • 1970-01-01
  • 2019-01-12
  • 2011-06-29
  • 2014-03-01
  • 2013-06-19
相关资源
最近更新 更多