假设我写了一个代码:
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*a和a + a的值在哪里(内存位置的数据类型是什么?)
如果你的INT_MAX
是2147483647
(pow(2, 31) - 1
),2*a
并且a+a
确实导致溢出,并且在有符号整数中溢出aritimetic 在C中是未定义的行为.
引自N1256 6.5表达式:
5如果在计算表达式期间发生异常情况(即,如果结果未在数学上定义或未在其类型的可表示值范围内),则行为未定义.
未定义的行为可能会导致一切.请参阅编译器的输出以了解此特定结果的原因.
要知道存储2*a
和a+a
存储值的位置,还要查看编译器的输出.我想如果编译器足够智能,它们应该存储在寄存器中,而不是存储在内存中.一些不良的编译器可能将它们的值存储在内存的堆栈上.