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