【问题标题】:Unexpected output of C++ programmC++ 程序的意外输出
【发布时间】:2016-09-16 16:22:43
【问题描述】:

我在turbo C编译器中编译了以下代码

void main()
{
  int i =400*400/400;

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

我预计 'i' 的值是 400,因此输出应该是 Filibusters。但是,我得到的输出是 Sea Ghirkins。这怎么可能?

【问题讨论】:

  • 首先应该是int main
  • 打印出i,看看它是否符合您的期望。
  • 不要使用已经过时 10 多年的编译器进行编译。
  • 400*400 为 160000,大于 16 位。我怀疑 Turbo C 使用 16 位 ints。
  • @GillBates AFAIK Turbo C++ 自 1998 年以来已过时。

标签: c++


【解决方案1】:

溢出你的int类型:这样做的行为是未定义

int 的范围可以小到 -32767 到 +32767。检查sizeof int 的值。如果是2,则无法表示400 * 400。也可以查看INT_MAX和INT_MIN的值。

请改用long,它必须至少为 32 位。或许本周末请您使用一个新的编译器?

【讨论】:

  • 这个问题本来是在turbo里问的,c++14谁不知道。我只是想知道 turbo 的输出。
  • C++14 是如何参与其中的?这是自古以来的法律。由于 16 位溢出,400 * 400 可能等于 28928 (0x7100)。 28928 / 400 = 72。
  • @user4581301 如果整数的大小是4字节,那么它会按预期运行,提到c++14只是表示这个问题是特别要求在turbo编译的!
  • @ShubhamBhatia 如果int 的大小为 4 个字节,则为真。 Bathsheba 的观点是 4 字节 int 不是标准要求的,这可以追溯到 C++ 的起源和它在 C 中的根源。如果你有 Turbo C++ 3,专为良好的 DOS 和 16 位 Windows 3 而设计,int 仅支持最低 16 位。最近的 TurboC++ 使用更大的 ints 来跟上新 CPU 的本机大小。如果您的代码无法生成 400,则可能是 TurboC++ 3 或更早版本。
【解决方案2】:

查看运算符 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)

【讨论】:

  • “您使用的是 16 位编译器”不一定:128 位编译器仍然可以有 16 位 int。此外,您的 -32768 下限仅适用于 2 的补码 int。除此之外,这个答案很可爱。
猜你喜欢
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 2017-10-07
  • 1970-01-01
  • 2021-10-12
  • 2015-09-20
  • 1970-01-01
  • 2021-10-13
相关资源
最近更新 更多