我在C ++中尝试使用unsigned long long的限制并遇到了一些麻烦。当我像这样将500万乘以500万时:
unsigned long long test = 5000000*5000000;
变量test
保存值18446744072704921600而不是25000000000000.我的理解是unsigned long long可以表示0到18446744073709551615,那么这里发生了什么?谢谢!
答案 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;