我试图理解以下代码:
#include <stdio.h>
int main()
{
int a=2147483647,b=1;
printf("%d\n",a+b);
printf("%d\n",a+b>a);
return 0;
}
由于a是最大整数,所以a+b应该是负数。 但最后一行打印出“True”。
如果我将第二个打印输出更改为 printf("%d ",2147483647+1>2147483647); 他们将发出警告并打印出 false,这正是我所期望的。 他们在编译器中的任何设置是否会导致这个结果?
内部溢出是未定义行为(UB),编译器可以自由地做它想做的事 - 这正是您所观察到的。编译器甚至没有比较数字。
.LC0:
.string "%d\n"
main:
push rax
mov esi, -2147483648
mov edi, OFFSET FLAT:.LC0
xor eax, eax
call printf
mov esi, 1
mov edi, OFFSET FLAT:.LC0
xor eax, eax
call printf
xor eax, eax
pop rdx
ret