unsigned long long的问题

时间:2014-09-10 01:32:46

标签: c++ long-integer unsigned

我在C ++中尝试使用unsigned long long的限制并遇到了一些麻烦。当我像这样将500万乘以500万时:

unsigned long long test = 5000000*5000000;

变量test保存值18446744072704921600而不是25000000000000.我的理解是unsigned long long可以表示0到18446744073709551615,那么这里发生了什么?谢谢!

3 个答案:

答案 0 :(得分:7)

默认情况下,编译器将5000000视为32位值。将两者相乘时,您仍然只使用32位值,因此它将溢出。只有在等式的左侧进行赋值时才会转换为64位。

解决方案是使至少一个操作数64位开始,例如:

unsigned long long test = 5000000i64*5000000;

然后编译器知道以64位值开始,不会发生溢出。

答案 1 :(得分:2)

我认为这里的问题是右侧正在进行乘法,假设操作数是int s,所以你得到溢出。尝试将其更改为

unsigned long long test = 5000000ULL * 5000000ULL;

并查看是否有任何修复。

希望这有帮助!

答案 2 :(得分:0)

您也可以尝试

unsigned long long op1 = 5000000;
unsigned long long test = op1 * 5000000;