假设我将代码编写为:
int main()
{
int i,a=2147483647;
if((2*a)<0)
printf("hello");
else
printf("world");
}
输出是世界的。 但是对于:
int main()
{
int i,a=2147483647;
if((a+a)<0)
printf("hello");
else
printf("world");
}
输出为hello
。
这是怎么回事?
2,存储在内存中的2 * a和a + a的值在哪里(内存位置的数据类型是什么?)
答案 0 :(得分:6)
如果您的freopen
为INT_MAX
(2147483647
),pow(2, 31) - 1
和2*a
确实会导致溢出,并且有符号整数aritimetic溢出 undefined C中的行为。
引自{{3}} 6.5表达式:
5如果在评估表达式期间发生异常情况(即,如果是 结果不是数学定义的,也不是在其可表示值的范围内 类型),行为未定义。
未定义的行为可能会导致所有内容。请参阅编译器的输出以了解此特定结果的原因。
要知道a+a
和2*a
的值存储位置,请参阅编译器的输出。我想如果编译器足够智能,它们应该存储在寄存器中,而不是存储在内存中。一些糟糕的编译器可能会将它们的值存储在内存中的堆栈上。