C x86上的int64_t范围限制是什么?

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,当有符号整数溢出时,调用未定义

在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;
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