比较上溢(下溢)数

问题描述 投票:0回答:1

我试图理解以下代码:

#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,这正是我所期望的。 他们在编译器中的任何设置是否会导致这个结果?

c logic overflow underflow
1个回答
0
投票

内部溢出是未定义行为(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
© www.soinside.com 2019 - 2024. All rights reserved.