在做CSAPP的datalab发现的一个问题,代码如下
int isTmax(int x)
{
int y = x + 1;
int z = y + y;
// printf("y = %d
", y);
// printf("z = %d
", z);
return (!z) (!!y);
}
int main()
{
printf("isTmax = %d
", isTmax(2147483647));
return 0;
}
当我注释掉printf时,返回值是0,当我放开注释后,
y = -2147483648
z = 0
isTmax = 1
这就是我预想的情况,应该返回1的,不知道为什么会出现这种情况。
使用的编译选项是gcc -O -Wall -m32 -lm -o,编译环境是虚拟机的debian 10 64位。
我又把它放到VS2019运行,即使没有注释也是返回的1和我预想的一样。
有符号数溢出是UB,所以我们直接通过编译器生成的汇编来看看不同编译器的处理逻辑吧。
TL;DR: