#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),但不是。怎么了?
答案 0 :(得分:2)
在此示例中,由于变量类型int的限制,第一个答案必须不正确(211509811),但不是。怎么了?
您的期望是错误的。有符号整数溢出的行为是不确定的。不需要答案是“不正确的”。毕竟,对于行为不确定的程序,没有“正确”的答案。
答案 1 :(得分:2)
在第一种情况下,您在同一行上乘以10并除以10,而没有任何事情会破坏编译器的优化(没有函数调用,变量赋值等)。因此,任何体面的编译器都不会相乘或相除,将存储相同的值,我想这就是发生在您身上的事情。
但是,如果您通过连续调用来破坏该优化,则可能会得到您想要的值,例如:
intVar =1500000000;
intVar*=10;
intVar/=10;
cout << "Value intVar equal "<<intVar <<endl;
可能的输出:
Value intVar equal 211509811
但是请注意,在两种情况下,您都在打开不确定行为的门。如果您是我,我将不会依赖编译器优化或缺少任何优化,尤其是当您使用不同的编译器和/或不同的平台时。
答案 2 :(得分:1)
您的示例调用未定义行为(UB),因为发生有符号整数溢出。
调用UB时,您无法确定会发生什么。这就是发生的情况,因此您的预测不准确。而且,如果您完全更改了预测,则由于调用了UB,因此它仍然是不准确的。
答案 3 :(得分:-1)
您将1,500,000,000保存在(可签名的)int中,该int可容纳2,147,483,647,因此您仍处于单个int的限制内。您下面的操作将被优化器清除。