C 和 C++ 是否保证类型的无符号等效项具有相同的大小?
例子:
size_t size = sizeof(unsigned int);
unsigned
这里完全没有意义吗?
两种语言都保证相应标准整数类型的有符号和无符号变体具有相同的大小。
C++,委员会草案 n3337,3.9.1/3:
3 对于每一种标准有符号整数类型,都存在相应的(但不同的)标准无符号整数类型:“unsigned char”、“unsigned short int”、“unsigned int”、“unsigned long int”和“unsigned long long int”,每一个都与对应的有符号整数类型45占用相同的存储量并具有相同的对齐要求(3.11);也就是说,每个有符号整数类型都具有与其对应的无符号整数类型相同的对象表示。[...]
对于 C,措辞非常相似
取自草案 n1570, 6.2.5/6:
对于每个有符号整数类型,都有一个对应的(但不同的)无符号整数类型(用关键字 unsigned 指定),它使用相同的存储量(包括符号信息)并具有相同的对齐要求。类型 _Bool 和对应于标准有符号整数类型的无符号整数类型是标准无符号整数类型。与扩展有符号整数类型对应的无符号整数类型是扩展无符号整数类型。标准和扩展的无符号整数类型统称为无符号整数类型。
它并不是真的过时,更像是多余的。该标准确实保证类型的有符号和无符号变体具有相同的大小。
你总是可以输入一些这样的代码
{
char s1[1 + sizeof(int) - sizeof(unsigned int)];
char s2[1 + sizeof(unsigned int) - sizeof(int)];
}
(可能仅在调试版本中)
如果它们的大小不同,这会给你一个编译时失败。
我偶尔会为我正在重构的高度(typedef)的代码执行此操作。
但是无符号和有符号的品种总是相同的大小。