我在 turbo C 编译器
中编译了以下代码void main()
{
int i =400*400/400;
if(i==400)
cout<<"Filibusters";
else
cout<<"Sea ghirkins";
}
我预计&#39; <&#39; 的值 400 ,因此输出应为 Filibusters 。但是,我得到的输出是 Sea Ghirkins 。这怎么可能?
答案 0 :(得分:5)
你溢出你的int
类型:这样做的行为是未定义。
int
的范围可以小到-32767到+32767。检查sizeof int
的值。如果它是2,则它将无法表示400 * 400.您还可以检查INT_MAX和INT_MIN的值。
使用long
代替,必须至少为32位。也许本周末你会把自己当作一个新的编译器?
答案 1 :(得分:3)
查看运算符associativity:*
和/
是左关联的,这意味着您的公式按此顺序计算:(400*400)/400
400*400=160000
。计算机算术是有限的。您正在使用16位编译器,其中int
适合16位,并且只能保存范围-32768 ... 32767
(why -32768?)中的值。 160000显然不适合该范围并被修剪(integer overflow发生)。然后将修剪后的值除以400并获得意想不到的效果。过去的编译器非常简单,所以我希望将类似72的东西存储到i
中。
以上意味着您可以使用更大的整数类型 - long
,它可以存储160000
或使用括号手动更改辅助:400*(400/400)
。