6

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

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

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

4

5 回答 5

17

您需要将至少一个操作数转换为乘法。在乘法完成时,系统不知道您打算分配给 int64。

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

于 2009-04-19T11:03:30.707 回答
7

这取决于 int32 和 int64 是什么。

简而言之,在任何算术运算之前,所有整数都至少提升为“int”大小(可能是 64 位),如果二元运算符的等级高于 int,则提升为更大操作数的大小。

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

于 2009-04-19T11:08:03.210 回答
3

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

关于数学运算需要注意的两点:

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

如果编译器注意到操作数之间的不匹配,它将转换其中一个操作数以使两者都匹配(请参阅在 C/C++ 中进行数学运算时应该对哪些变量进行类型转换?)。注意:这是独立于结果发生的情况进行的。

于 2009-04-19T15:55:44.703 回答
0

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

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

在上面的代码中,您有两个 31 位数字(因为 INT_MAX - 1 = 0x7FFFFFFE 使用 31 位),您需要将其中一个转换为 int64_t,因为它会在转换为 int64_t 之前执行 32 位乘法和溢出。


定点乘法所需的位数:

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 之类的东西,它将数字转换为二进制形式并计算使用的位数。

于 2009-04-19T12:29:33.467 回答
0

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

于 2009-04-20T15:32:46.310 回答