C ++错误导致两个无符号long long整数相乘
C++ wrong result in multiplication of two unsigned long long integers
考虑以下 unsigned long long
个整数的乘法:
unsigned long long a=4294967297;
unsigned long long b=4294967297;
cout<<a*b<<endl;
8589934593
我没想到这个答案。相反,我期待得到:
18446744065119617025
请注意,根据this source,unsigned long long
可以表示的最大整数是18446744073709551615
(或十六进制0xffffffffffffffff
)。这比我预期的 18446744065119617025
大 8589934590
,所以我假设这个数字仍然可以表示。
这是怎么回事,如何解决这个问题?
编辑:
你们是对的,我在玩不同的数字,混淆了 4294967297
和 4294967295
的平方结果。最后 7
它会溢出。感谢您指出这一点。
我认为你的数学计算有误:
slowpy3.8> 4294967297 * 4294967297
18446744082299486209
slowpy3.8> hex(_)
'0x10000000200000001'
slowpy3.8> 0xffffffffffffffff > 0x10000000200000001
False
slowpy3.8> math.log2(18446744082299486209)
64.0000000006718
slowpy3.8>
考虑以下 unsigned long long
个整数的乘法:
unsigned long long a=4294967297;
unsigned long long b=4294967297;
cout<<a*b<<endl;
8589934593
我没想到这个答案。相反,我期待得到:
18446744065119617025
请注意,根据this source,unsigned long long
可以表示的最大整数是18446744073709551615
(或十六进制0xffffffffffffffff
)。这比我预期的 18446744065119617025
大 8589934590
,所以我假设这个数字仍然可以表示。
这是怎么回事,如何解决这个问题?
编辑:
你们是对的,我在玩不同的数字,混淆了 4294967297
和 4294967295
的平方结果。最后 7
它会溢出。感谢您指出这一点。
我认为你的数学计算有误:
slowpy3.8> 4294967297 * 4294967297
18446744082299486209
slowpy3.8> hex(_)
'0x10000000200000001'
slowpy3.8> 0xffffffffffffffff > 0x10000000200000001
False
slowpy3.8> math.log2(18446744082299486209)
64.0000000006718
slowpy3.8>