Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 32位整数*32位整数=64位整数?_C++_Integer Overflow - Fatal编程技术网

C++ 32位整数*32位整数=64位整数?

C++ 32位整数*32位整数=64位整数?,c++,integer-overflow,C++,Integer Overflow,换句话说,这是否如预期的那样有效 int32 i = INT_MAX-1; int64 j = i * i; 或者我需要先将I转换为64位吗?您需要将至少一个操作数转换为乘法。在乘法完成时,系统不知道您计划分配给int64 (除非int64实际上是特定系统的本机int类型,这似乎不太可能)这取决于int32和int64是什么 简言之,在任何算术运算之前,所有整数都至少提升到“int”大小(可能是64位),如果二进制运算符的秩大于int,则提升到较大操作数的大小 表达式结果的使用方式(无论是否存

换句话说,这是否如预期的那样有效

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

或者我需要先将I转换为64位吗?

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


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

这取决于int32和int64是什么

简言之,在任何算术运算之前,所有整数都至少提升到“int”大小(可能是64位),如果二进制运算符的秩大于int,则提升到较大操作数的大小


表达式结果的使用方式(无论是否存储为更广泛的类型)与表达式组成部分的升级无关。

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

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

在上面的代码中,您有两个31位的数字(因为INT_MAX-1=0x7ffffe使用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的工具,将数字转换为二进制形式并计算所用的位。

基本答案是“否”,它不会满足您的要求。
但它确实做到了预期的效果

关于数学运算,需要注意两件事:

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

如果编译器注意到两个操作数之间不匹配,它将转换其中一个操作数,以便两个操作数都匹配(请参阅)。注意:这是在与结果发生的情况隔离的情况下完成的。

请参阅:14。简单整数类型和memsize类型的混合使用。

这取决于你的期望——但威尔·迪恩对所发生的事情的看法是正确的,而且可能不是你所期望的。检查:常见的技巧是先乘以1L而不是施放:int64 j=1L*i*i;如果您的long长度为64位,则此方法有效。如果您的
long
长度仅为32位,则可以在大多数现代编译器上使用1LL。或者您可以使用stdint.h中的INT64_C(1)使其具有合理的可移植性(您可能需要为MS编译器挖掘一个stdint.h,可能来自MinGW,也可能来自int32和int64?它们应该像int32和int64吗?