指定64位数据模型上的64位无符号整数文字
由于64位数据模型(LLP64/IL32P64,LP64/I32LP64,ILP64,SILP64)有各种类型,因此指定64位无符号整数文字?指定64位数据模型上的64位无符号整数文字
将指定ULL的后缀就足够了?或者我最终会导致文字在某些数据模型上被解释为128位?
您应该使用<cstdint>/<stdint.h>
,如果您有它。这将使您:
-
uint64_t
是无符号整数类型,其大小为64个比特 -
UINT64_C()
是用于创建类型uint64_t
的常数,通过具有宏追加适当的后缀的宏。
据我所知,是没有办法的后缀文字到特定位宽的整数。你唯一的选择是l,ul,ll和ull。
如果您对此偏执,您将不得不将文字包裹在#if
中,以检查long
/long long
的尺寸。
话又说回来,作为KennyTM上文所指出的,只要你的文字是在分配给64位值的64位范围和,它没有多大意义,如果字面本身是64或128位,或可以?
这不会导致编译器抱怨我将一个需要较大位宽的整数指定为较小的整数(截断警告)吗? –
使用大写后缀保持签名文字可读:1L,1LL而不是1l,1ll。 – pixelgrease
...或使用正确区分1/l,0/O的字体... – DevSolar
C和C++不具有标准化32/64/128位变量类型。例如,在某些系统上,很长一段时间是32位,而其他系统则是64位。这很烦人,但大多数操作系统确实提供了一些更好的类型定义来帮助你,比如uint32
等等,所以你可以选择一个你需要的确切类型。
这是一个好的configure
脚本的工作:确定系统提供了什么,测试它的工作原理,并帮助您为正在运行的正确架构选择正确的类型。
大部分情况并不重要。如果你不给它一个后缀,整型文本的类型由它的值决定。如果编译器具有32位和unsigned long
64位unsigned long long
,一个无符号的值过大,以适应在一个unsigned long
但不能太大为unsigned long long
将具有类型unsigned long long
。
如果你分配到'uint64_t'整数它应该罚款。 – kennytm
@KennyTM:只能达到2^32 - 1,此时您可能会遇到麻烦... – DevSolar
@DevSolar:我的意思是带有ULL后缀的整数,这对于最大值为18446744073709551615的值肯定适用。 – kennytm