C++ C++;两个无符号长整数相乘的错误结果
考虑以下无符号长整数的乘法:C++ C++;两个无符号长整数相乘的错误结果,c++,unsigned-long-long-int,C++,Unsigned Long Long Int,考虑以下无符号长整数的乘法: unsigned long long a=4294967297; unsigned long long b=4294967297; cout<<a*b<<endl; 无符号长a=4294967297; 无符号长b=4294967297; 我想你的数学算错了: slowpy3.8> 4294967297 * 4294967297 18446744082299486209 slowpy3.8> hex(_) '0x100000002
unsigned long long a=4294967297;
unsigned long long b=4294967297;
cout<<a*b<<endl;
无符号长a=4294967297;
无符号长b=4294967297;
我想你的数学算错了:
slowpy3.8> 4294967297 * 4294967297
18446744082299486209
slowpy3.8> hex(_)
'0x10000000200000001'
slowpy3.8> 0xffffffffffffffff > 0x10000000200000001
False
slowpy3.8> math.log2(18446744082299486209)
64.0000000006718
slowpy3.8>
我认为你的数学算错了:
slowpy3.8> 4294967297 * 4294967297
18446744082299486209
slowpy3.8> hex(_)
'0x10000000200000001'
slowpy3.8> 0xffffffffffffffff > 0x10000000200000001
False
slowpy3.8> math.log2(18446744082299486209)
64.0000000006718
slowpy3.8>
a*b=18446744082299486209大于18446744073709551615将类型更改为constexpr
并添加结果constexpr unsigned long c=a*b
立即警告该操作会导致算术溢出。4294967297
是2^32+1
因此4294967297^2>2^64
不适合无符号长型
。a*b=184467440822994486209大于18446744073709551615将类型更改为constexpr
,并添加结果constexpr无符号长c=a*b
立即警告该操作会导致算术溢出。4294967297
是2^32+1
,因此4294967297^2>2^64
不适合无符号长字符
。