32

由于有各种类型的 64 位数据模型(LLP64/IL32P64、LP64/I32LP64、ILP64、SILP64),指定 64 位无符号整数文字的标准符合方式是什么?

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

4

4 回答 4

42

如果你有,你应该使用<cstdint> / <stdint.h>它。这会给你:

  • uint64_t是一个无符号整数类型,大小为 64 位
  • UINT64_C()是一个用于创建类型常量的uint64_t宏,通过让宏附加正确的后缀。
于 2012-10-31T13:53:25.763 回答
2

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

如果您对此感到偏执,则必须将文字包装在#if检查long/的大小中long long

再说一次,正如 KennyTM 上面指出的那样,只要您的文字64 位范围内分配给 64 位值,文字本身是 64 位还是 128 位并不重要,或者是吗?

于 2012-10-31T13:26:59.557 回答
2

在大多数情况下,这并不重要。如果你不给它一个后缀,一个整数文字的类型是由它的值决定的。如果编译器有 32 位unsigned long和 64 位unsigned long long,那么一个太大而无法放入 anunsigned long但又不太适合 an 的无符号值unsigned long long将具有 type unsigned long long

于 2012-10-31T13:42:41.947 回答
1

C 和 C++ 没有标准化的 32/64/128 位变量类型。例如,long 在某些系统上是 32 位,而在其他系统上是 64 位。这很烦人,但大多数操作系统确实提供了一些更好的 typedef 来帮助您,例如uint32等,因此您可以选择您需要的确切类型。

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

于 2012-10-31T13:32:33.367 回答