我有一个项目,我处理大数(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()
应该直接适合。
答案 0 :(得分:5)
对我来说,好像
2*max()
首先存储在一个整数中(在此步骤中被截断),然后复制到int64
这是绝对正确的。根据语言规范,当表达式的所有部分都适合int
时,计算以整数完成。在您的情况下,2
和max()
都适合int
,因此乘法以整数形式完成,从而导致溢出。
编译器知道结果属于
int64
类型,因此2*max()
应该直接适合。
在这种情况下,分配表达式的结果无关紧要:表达式本身指示计算方式。通过将max()
转换为int64
:
int64_t val = 2*(int64_t)std::numeric_limits<int>::max();