C x86上的int64_t范围限制是什么?
在x86上测试一些整数乘法C x86上的int64_t范围限制是什么?,c,gcc,C,Gcc,在x86上测试一些整数乘法 int32_t a = 2097152; int64_t b = a * a; 为什么上面的b计算结果为零 x86上的int64_t范围限制是什么 表示[-2^64;2^64-1],这相当于[-9223372036854775808;9223372036854775807]您可以通过打印INT64\u MAX和INT64\u MIN获得它 为什么上面的b值为零 因为在乘法运算完成之前,提升不会发生。a*a的结果类型为int32\u t,当有符号整数溢出时,调用未定义
int32_t a = 2097152;
int64_t b = a * a;
为什么上面的b
计算结果为零
x86上的int64_t范围限制是什么
表示[-2^64;2^64-1]
,这相当于[-9223372036854775808;9223372036854775807]
您可以通过打印INT64\u MAX
和INT64\u MIN
获得它
为什么上面的b值为零
因为在乘法运算完成之前,提升不会发生。a*a
的结果类型为int32\u t
,当有符号整数溢出时,调用未定义行为。你所做的基本上是这样的:
int32_t a = 2097152;
int32_t tmp = a * a;
int64_t b = tmp;
您可以通过以下方式获得所需的结果:
int32_t a = 2097152;
int64_t b = (int64_t) a * a;
因为您将两个32位的值相乘,得到一个32位的结果 所以实际上你得到了
(a*a)%2^32
自
2097152*2097152=4398046511104=0x40000000000
您将获得结果的
0x00000000
部分
如果你想做一个正确的64位乘法,你必须转换其中一个参数
int64_t b = (int64_t)a * a;
int64_t
限制在您的示例中是不相关的,因为b
的类型只有在计算了a*a
表达式并且已经造成了损坏之后才起作用
执行算术时,执行“常用算术转换”,即将值转换为至少为int
的通用类型;在这种情况下,int32\u t
可能已经是引擎盖下的int
,因此这两个值保持原样,并执行32位乘法。这溢出了int32\u t
的范围,结果可以看到(请注意,签名溢出实际上是未定义的行为)
要使其按预期运行,必须首先将至少一个操作数强制转换为int64\t
,以便在64位算术中执行乘法
int64_t b = ((int64_t)a) * a;
我认为首先需要将其中一个操作数强制转换为64位。试试int64_t b=(int64_t)a*a