C ++程序

时间:2016-09-16 16:22:44

标签: c++

我在 turbo C 编译器

中编译了以下代码
void main()
{
  int i =400*400/400;

  if(i==400)
    cout<<"Filibusters";
  else
    cout<<"Sea ghirkins";
}

我预计&#39; <&#39; 的值 400 ,因此输出应为 Filibusters 。但是,我得到的输出是 Sea Ghirkins 。这怎么可能?

2 个答案:

答案 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 ... 32767why -32768?)中的值。 160000显然不适合该范围并被修剪(integer overflow发生)。然后将修剪后的值除以400并获得意想不到的效果。过去的编译器非常简单,所以我希望将类似72的东西存储到i中。

以上意味着您可以使用更大的整数类型 - long,它可以存储160000或使用括号手动更改辅助:400*(400/400)