由于存在各种类型的64位数据模型(LLP64 / IL32P64,LP64 / I32LP64,ILP64,SILP64),因此指定64位无符号整数文字的标准符合方式是什么?
指定ULL后缀是否足够?还是会导致在某些数据模型上将文字解释为128位?
如果你有的话,应该使用 <cstdint> / <stdint.h>
。这将会给你:
uint64_t
是一个无符号整数类型,长度为 64 位UINT64_C()
是创建 uint64_t
类型常量的宏,它会自动添加正确的后缀。UNIT64_C
解析为 uint_least64_t
,而不是 uint64_t
。;-) - DevSolar大多数情况下,这并不重要。如果您没有给整数字面值添加后缀,其类型将由其值确定。如果编译器具有32位的unsigned long
和64位的unsigned long long
,那么一个无符号值如果太大而无法容纳在unsigned long
中,但不太大到无法容纳在unsigned long long
中,则其类型为unsigned long long
。
C和C++没有标准化的32/64/128位变量类型。例如,某些系统上的long是32位,而在其他系统上则是64位。这很烦人,但大多数操作系统确实提供了一些更好的typedefs来帮助您选择所需的确切类型,例如uint32
等。
这是一个好的configure
脚本的工作:确定系统提供的内容,测试其是否有效,并帮助您选择适合您正在运行的正确架构的正确类型。
<stdint.h>
和<cstdint>
头文件中提供了给定大小的标准化变量类型。它们有像uint32_t
这样的名称。 - amaureauint32_t
这样的名称在没有这些确切大小的系统上是不可用的。在几乎所有情况下,uint_least32_t
等会是更好的选择。 - Pete Beckeruint32_t
和 uint64_t
的系统几乎不可能找到,它们属于字节不是8位长和其他奇特系统的同一类别,不是吗? - amaureauint64_t
是否存在,它都不能帮助想要编写64位整数字面量的人。 - jalf
uint64_t
,那应该没问题。 - kennytm