6

我有一个项目,我处理不适合整数的大数字(ns-timestamps)。因此,我想使用例如 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()应该直接适合。

4

1 回答 1

5

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

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

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

在这种情况下,分配表达式的结果无关紧要:表达式本身决定了它的计算方式。您可以通过强制转换来获得相同的max()结果int64

int64_t val = 2*(int64_t)std::numeric_limits<int>::max();
于 2014-07-08T09:22:28.690 回答