换句话说,这个是否按照预期工作?
或者我需要先将 i 转换为 64 位吗?
int32 i = INT_MAX-1;
int64 j = i * i;
或者我需要先将 i 转换为 64 位吗?
int32 i = INT_MAX-1;
int64 j = i * i;
long
只有32位,你可以在大多数现代编译器上使用1LL。 - Head Geek这取决于int32和int64是什么。
简而言之,在进行任何算术运算之前,所有整数都会提升至至少'int'大小(可能为64位),如果二元运算符的较大操作数的等级高于int,则会提升为该操作数的大小。
表达式的结果如何使用(是否存储到更宽的类型中)对表达式组成部分的提升没有影响。
给出两个数字a,b,每个数字使用len_a和len_b位。
你的输出数据类型至少需要:len_a和len_b位。
在你上面的代码中,你有两个31位的数字(因为INT_MAX - 1 = 0x7FFFFFFE使用31位),你将需要将它们中的一个转换为int64_t,因为它将进行32位乘法并溢出,然后再转换为int64_t。
len_output = howManyBits( a * b )
= len_a + len_b
a = 7
len_a = 3
b = 7
len_b = 3
c = a * b
= 49 ( decimal )
= 0x31 ( hex )
len_c = howManyBits( 0x31 )
= 6