为什么`while(base * 10< = 2147447412)`溢出

时间:2014-05-17 18:29:58

标签: c++

numeric_limits :: max()=> 2147483647

int x = 2147447412;
int base = 1;
while (base * 10 <= x) 
    base *= 10; // this loop will run forever.

while ((long long)(base * 10) <= (long long)(x)) 
    base *= 10; // this loop still will run forever

while (x - base * 10 >= 0 ) 
    base *= 10; // this loop will stop.

问题&GT;为什么while循环会永远运行?溢出?

4 个答案:

答案 0 :(得分:1)

是的,溢出。一旦base达到1e9,base * 10就会溢出。所以你有不确定的行为。

答案 1 :(得分:1)

修正代码,在执行乘法运算之前检测 溢出的内容:

int const kBase = 10;
int const kMax  = numeric_limits<decltype(kBase)>::max() / kBase;

int b = 1;
do {
  b *= kBase;
} while (b <= kMax);

答案 2 :(得分:0)

base1000000000base *= 10;完成后,它会显示未定义的行为。在你的情况下,它似乎溢出成为负面。

答案 3 :(得分:0)

在某些时候,base的值将为1000000000,小于x,但乘以10会溢出,因此while中的条件永远不会遇到{1}}循环。