在论坛上看见一个问题,比较有意思,记录下
问题代码:
#include <iostream>
int main() {
int64_t res;
int some_val = 5;
if (false) {
res = static_cast<uint32_t>(some_val);
} else {
res = -1;
}
std::cout << "first check: " << res << std::endl;
res = (false) ? static_cast<uint32_t>(some_val) : (-1);
std::cout << "second check: " << res << std::endl;
return 0;
}
输出:
-1
4294967295
第二个输出为什么是 4294967295,而不是 -1 呢
主要问题在这行代码上,
res = (false) ? static_cast<uint32_t>(some_val) : (-1);
这行代码可以转换成下面的形式,
res = static_cast<int64_t>(false ? static_cast<uint32_t>(some_val) :
static_cast<uint32_t>(-1));
可以看出是把无符号整数的 -1 强转为有符号的 64 位整数型
而 -1 在 uint32_t 中并不会保持为负值,它只能表示非负的整数值,所以 -1 会被解释为一个很大的正整数,具体取决于该类型的最大值(UINT32_MAX)
UINT32_MAX 值等于 4294967295
int64_t 的取值范围是 -9223372036854775808 到 9223372036854775807,所以放下 UINT32_MAX 没有压力
在 uin32_t 中,-1 被表示为该类型的最大值减去它的绝对值再加 1,即 4294967295 - 1 + 1,结果为 4294967295