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吗?