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循环会永远运行?溢出?
答案 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)
当base
为1000000000
且base *= 10;
完成后,它会显示未定义的行为。在你的情况下,它似乎溢出成为负面。
答案 3 :(得分:0)
在某些时候,base
的值将为1000000000
,小于x
,但乘以10
会溢出,因此while
中的条件永远不会遇到{1}}循环。