我应该使用static_cast还是INT64_C来可移植地分配64位常量
Should I use static_cast or INT64_C to assign 64-bit constant portably?
将64位常量指定为
int64_t foo = 0x1234LL;
是不可移植的,因为long long
不一定是int64_t
。这篇文章哪个初始值设定项适用于int64_t?讨论了<stdint.h>
中INT64_C()
宏的使用,但是否也可以使用static_cast
作为
int64_t foo = static_cast<int64_t>(0x1234);
我应该更喜欢哪一个,为什么,或者两者都很好吗?
我在互联网和SO上搜索过,但没有找到任何探索static_cast
选项的地方。我还使用sizeof()
进行了测试,以确认它在简单的情况下有效。
实际上,C实现限制头<climits>
保证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
... | ... | ...
相关文章:
- C++Union/Struct位域的实现和可移植性
- 具有Qt事件循环的可移植通用共享库设置
- 没有执行策略的 std::transform_reduce 是可移植的吗?
- 如何在 c++ 中正确指定 #include 路径以使程序可移植
- 创建异构顶点数据数组的可移植方法
- FlatBuffers/Protobuf 中是否有支持任意 24 位有符号整数定义的可移植二进制序列化架构?
- 静态库可移植性
- 从非类型模板参数声明 constexpr 数组的可移植方法
- C++:Unicode 字符串文字的可移植性
- 如何使Visual Studio 2017 C++项目在计算机之间更具可移植性
- 尝试将 sfml 和 c++ 与 Windows 10 上的可移植 vscode 链接起来
- 在C++中获取命名空间名称的任何可移植技巧
- STR这个实现是否安全且可移植?
- 编写 std::copysign 的可移植 SSE/AVX 版本
- 是可移植的包装结构
- 将参数推送到调用堆栈 (C++) 的可移植方法
- 在为视频游戏实施基本的二进制序列化时,请担心可移植性
- 如何以可移植方式删除名称为 wchar_t 类型的文件C++
- C++中的可重新分配引用
- 我应该使用static_cast还是INT64_C来可移植地分配64位常量