大整数值的定义

时间:2014-07-08 09:17:09

标签: c++ casting int64

我有一个项目,我处理大数(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()应该直接适合。

1 个答案:

答案 0 :(得分:5)

  

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

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

  

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

在这种情况下,分配表达式的结果无关紧要:表达式本身指示计算方式。通过将max()转换为int64

,您可以获得相同的结果
int64_t val = 2*(int64_t)std::numeric_limits<int>::max();