指定64位数据模型上的64位无符号整数文字

问题描述:

由于64位数据模型(LLP64/IL32P64,LP64/I32LP64,ILP64,SILP64)有各种类型,因此指定64位无符号整数文字?指定64位数据模型上的64位无符号整数文字

将指定ULL的后缀就足够了?或者我最终会导致文字在某些数据模型上被解释为128位?

+0

如果你分配到'uint64_t'整数它应该罚款。 – kennytm

+0

@KennyTM:只能达到2^32 - 1,此时您可能会遇到麻烦... – DevSolar

+0

@DevSolar:我的意思是带有ULL后缀的整数,这对于最大值为18446744073709551615的值肯定适用。 – kennytm

您应该使用<cstdint>/<stdint.h>,如果您有它。这将使您:

  • uint64_t是无符号整数类型,其大小为64个比特
  • UINT64_C()是用于创建类型uint64_t的常数,通过具有宏追加适当的后缀的宏。
+2

的用户保证可以在C++中使用UINT64_C? (问题是关于C++,而不是C99) – jalf

+0

@jalf好点,谢谢!我不确定,但似乎是。我重写并更改了链接。 – unwind

据我所知,是没有办法的后缀文字到特定位宽的整数。你唯一的选择是l,ul,ll和ull。

如果您对此偏执,您将不得不将文字包裹在#if中,以检查long/long long的尺寸。

话又说回来,作为KennyTM上文所指出的,只要你的文字是在分配给64位值的64位范围,它没有多大意义,如果字面本身是64或128位,或可以?

+0

这不会导致编译器抱怨我将一个需要较大位宽的整数指定为较小的整数(截断警告)吗? –

+0

使用大写后缀保持签名文字可读:1L,1LL而不是1l,1ll。 – pixelgrease

+0

...或使用正确区分1/l,0/O的字体... – DevSolar

C和C++不具有标准化32/64/128位变量类型。例如,在某些系统上,很长一段时间是32位,而其他系统则是64位。这很烦人,但大多数操作系统确实提供了一些更好的类型定义来帮助你,比如uint32等等,所以你可以选择一个你需要的确切类型。

这是一个好的configure脚本的工作:确定系统提供了什么,测试它的工作原理,并帮助您为正在运行的正确架构选择正确的类型。

+3

C和C++ * do *在''和''标头中提供给定尺寸的标准化变量类型。他们有诸如'uint32_t'这样的名字。 – amaurea

+0

@amaurea - 诸如'uint32_t'之类的名称在不具有**精确**大小的系统上不可用。在几乎所有情况下,'uint_least32_t'等都是更好的选择。 –

+0

@Pete Becker系统没有'uint32_t'和'uint64_t'几乎是不可能找到的,是不是属于与字节长度不是8位的系统属于同一类别? – amaurea

大部分情况并不重要。如果你不给它一个后缀,整型文本的类型由它的值决定。如果编译器具有32位和unsigned long 64位unsigned long long,一个无符号的值过大,以适应在一个unsigned long但不能太大为unsigned long long将具有类型unsigned long long