大整数值的定义

Foo*_*Bar 6 c++ casting int64

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

为了检查大数字的行为,我开始使用类似的东西

int64_t val = 2*std::numeric_limits<int>::max();
qDebug() << "long val" << val;
Run Code Online (Sandbox Code Playgroud)

返回

long val -2
Run Code Online (Sandbox Code Playgroud)

(就像我将val定义为int).

但如果我写

int64_t val = std::numeric_limits<int>::max();
val *= 2;
qDebug() << "long val" << val;
Run Code Online (Sandbox Code Playgroud)

我明白了

long val 4294967294
Run Code Online (Sandbox Code Playgroud)

看起来很正确.

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

das*_*ght 5

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

这绝对是正确的.根据语言规范,当表达式的所有部分都适合时int,计算以整数完成.在你的情况,无论是2max()做适合在int,所以乘法的整数做,造成溢出.

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

在这种情况下,分配表达式的结果无关紧要:表达式本身指示计算方式.您可以通过转换为以下内容max()来实现相同的结果int64:

int64_t val = 2*(int64_t)std::numeric_limits<int>::max();
Run Code Online (Sandbox Code Playgroud)