大整数值的定义

Definition of large integer value

本文关键字:定义 整数      更新时间:2023-10-16

我有一个项目,我处理不适合整数的大数(ns-时间戳)。因此,我想使用例如int64_t,并且正在编写一个测试用例(是的!)。

为了检查大数字的行为,我从

开始
int64_t val = 2*std::numeric_limits<int>::max();
qDebug() << "long val" << val;

返回

long val -2

(就像我把val定义为int一样)。

但是如果我写

int64_t val = std::numeric_limits<int>::max();
val *= 2;
qDebug() << "long val" << val;

我得到

long val 4294967294

看起来是正确的。

所以对我来说,看起来好像2*max()首先存储在一个整数中(在这一步中被截断),然后复制到int64。为什么会发生这种情况?编译器知道结果是int64类型,所以它应该直接适合2*max()

所以对我来说,看起来好像2*max()首先存储在一个整数中(在这一步中被截断),然后复制到int64

这绝对正确。根据语言规范,当表达式的所有部分都适合int时,计算以整数形式完成。在您的示例中,2max()都适合int,因此乘法以整数进行,导致溢出。

编译器知道结果是int64类型,因此2*max()应该直接适合。

在这种情况下,表达式的赋值结果并不重要:表达式本身指导计算的方式。您可以通过将max()转换为int64来获得相同的结果:

int64_t val = 2*(int64_t)std::numeric_limits<int>::max();