32bit int * 32bit int = 64 bit int?

时间:2009-04-19 11:00:48

标签: c++ integer-overflow

换句话说,这是否按预期工作?

int32 i = INT_MAX-1;
int64 j = i * i;

还是我需要先将i转换为64位?

5 个答案:

答案 0 :(得分:17)

您需要将至少一个操作数强制转换为乘法。在完成乘法的过程中,系统不知道您计划分配给int64。

(除非int64实际上是您的特定系统的本机int类型,这似乎不太可能)

答案 1 :(得分:7)

这取决于int32和int64是什么。

简而言之,在任何算术运算之前,所有整数都被提升为至少'int'大小(可能是64位),如果它的排名大于int,则为二进制运算符的较大操作数的大小。

如何使用表达式的结果(无论它是否存储到更宽的类型)与表达式的组成部分的促销无关。

答案 2 :(得分:3)

基本答案是不,它不会做你想做的事 但它确实做了预期的事情。

有关数学运算的两点注意事项:

  • 两个操作数都是相同的类型。
  • 结果类型与输入相同。

如果编译器注意到操作数之间不匹配,它将转换其中一个操作数,以便两者匹配(参见Which variables should I typecast when doing math operations in C/C++?)。注意:这是根据结果发生的事情单独完成的。

答案 3 :(得分:0)

给定两个数字a,b,每个数字使用len_a和len_b位。

您的输出数据类型至少需要:len_a和len_b位。

在上面的代码中,您有两个31位数字(因为INT_MAX - 1 = 0x7FFFFFFE使用31位),您需要将其中一个类型转换为int64_t,因为它会在转换为32位之前执行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

您可以编写一个计数位的函数。或者,如果您只是想要快速进行健全性检查以确认此操作,请使用类似Windows Calc的内容,将数字转换为二进制形式并计算使用的位数。

答案 4 :(得分:0)

参见:14。简单整数类型和memsize类型的混合使用。 http://www.viva64.com/art-1-2-599168895.html