众所周知,有符号整数溢出是未定义的行为.但是C++ 11 cstdint文档中有一些有趣的东西:
有符号整数类型,宽度分别为8,16,32和64位,没有填充位,负值使用2的补码(仅当实现直接支持该类型时提供)
这里是我的问题:由于标准明确地说,对int8_t,int16_t,int32_t和int64_t负数是2的补,仍然是这些类型的未定义行为的泛滥?
编辑我检查了C++ 11和C11标准,这是我发现的:
C++ 11,§18.4.1:
标题定义了所有函数,类型和宏,与C标准中的7.20相同.
C11,§7.20.1.1:
typedef名称
intN_t指定有符号整数类型,其宽度为N,无填充位和二进制补码表示.因此,int8_t表示这样的带符号整数类型,其宽度恰好为8位.
void fun(){
signed int a=-5;
unsigned int b=-5;
printf("the value of b is %u\n",b);
if(a==b)
printf("same\n");
else
printf("diff");
}
Run Code Online (Sandbox Code Playgroud)
它是印刷:
4294967291
相同
在第二行中,有符号值转换为无符号值.所以b的值为UINTMAX + 1 - 5 = 4294967291.
我的问题是比较操作中发生了什么.
1)是否再次转换为无符号并与b进行比较?
2)b(即无符号)是否会被转换为有符号值并自动进行比较?
3)由于int溢出,是否从unsigned转换为signed undefined?
我已阅读有关该主题的其他帖子.我只想澄清问题2和问题3.