由于有各种类型的 64 位数据模型(LLP64/IL32P64、LP64/I32LP64、ILP64、SILP64),指定 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 位并不重要,或者是吗?
在大多数情况下,这并不重要。如果你不给它一个后缀,一个整数文字的类型是由它的值决定的。如果编译器有 32 位unsigned long
和 64 位unsigned long long
,那么一个太大而无法放入 anunsigned long
但又不太适合 an 的无符号值unsigned long long
将具有 type unsigned long long
。
C 和 C++ 没有标准化的 32/64/128 位变量类型。例如,long 在某些系统上是 32 位,而在其他系统上是 64 位。这很烦人,但大多数操作系统确实提供了一些更好的 typedef 来帮助您,例如uint32
等,因此您可以选择您需要的确切类型。
这是一个好的configure
脚本的工作:确定系统提供什么,测试它是否工作,并帮助您为正在运行的正确架构选择正确的类型。