评估c中if语句中的表达式

Aka*_*rma 1 c

假设我写了一个代码:

int main()
{
    int i,a=2147483647;

    if((2*a)<0)
        printf("hello");
    else
    printf("world");
}
Run Code Online (Sandbox Code Playgroud)

输出是世界的.但对于 :

int main()
{
    int i,a=2147483647;
    if((a+a)<0)
        printf("hello");
    else
        printf("world");
}
Run Code Online (Sandbox Code Playgroud)

输出是hello.

这是怎么回事?
存储在内存中的2*a和a + a的值在哪里(内存位置的数据类型是什么?)

Mik*_*CAT 6

如果你的INT_MAX2147483647(pow(2, 31) - 1),2*a并且a+a确实导致溢出,并且在有符号整数中溢出aritimetic 在C中是未定义的行为.

N1256 6.5表达式:

5如果在计算表达式期间发生异常情况(即,如果结果未在数学上定义或未在其类型的可表示值范围内),则行为未定义.

未定义的行为可能会导致一切.请参阅编译器的输出以了解此特定结果的原因.

要知道存储2*aa+a存储值的位置,还要查看编译器的输出.我想如果编译器足够智能,它们应该存储在寄存器中,而不是存储在内存中.一些不良的编译器可能将它们的值存储在内存的堆栈上.