C ++ int变量值

时间:2018-08-21 13:32:28

标签: c++

#include <iostream>
using namespace std;
int main()
{
  int intVar =1500000000;
  intVar = (intVar *10)/10;
  cout << "Value intVar equal "<<intVar <<endl;

  intVar =1500000000;
  intVar = (static_cast<double>(intVar)*10)/10;
  cout << "Value intVar equal " <<intVar<<endl;

  return 0;
}

在此示例中,由于变量类型 int 的限制,第一个答案必须是错误的(211509811),但不是。怎么了?

4 个答案:

答案 0 :(得分:2)

  

在此示例中,由于变量类型int的限制,第一个答案必须不正确(211509811),但不是。怎么了?

您的期望是错误的。有符号整数溢出的行为是不确定的。不需要答案是“不正确的”。毕竟,对于行为不确定的程序,没有“正确”的答案。

答案 1 :(得分:2)

在第一种情况下,您在同一行上乘以10并除以10,而没有任何事情会破坏编译器的优化(没有函数调用,变量赋值等)。因此,任何体面的编译器都不会相乘或相除,将存储相同的值,我想这就是发生在您身上的事情。

但是,如果您通过连续调用来破坏该优化,则可能会得到您想要的值,例如:

intVar =1500000000;
intVar*=10;
intVar/=10;
cout << "Value intVar equal "<<intVar <<endl;

可能的输出:

Value intVar equal 211509811

Example

但是请注意,在两种情况下,您都在打开不确定行为的门。如果您是我,我将不会依赖编译器优化或缺少任何优化,尤其是当您使用不同的编译器和/或不同的平台时。

答案 2 :(得分:1)

您的示例调用未定义行为(UB),因为发生有符号整数溢出。

调用UB时,您无法确定会发生什么。这就是发生的情况,因此您的预测不准确。而且,如果您完全更改了预测,则由于调用了UB,因此它仍然是不准确的。

答案 3 :(得分:-1)

您将1,500,000,000保存在(可签名的)int中,该int可容纳2,147,483,647,因此您仍处于单个int的限制内。您下面的操作将被优化器清除。