有意思的数值转换
在论坛上看见一个问题,比较有意思,记录下
原帖:
- Casting inside a ternary operator causes underflow
问题代码:
#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
在 uin32_t 中,-1 被表示为该类型的最大值减去它的绝对值再加 1,即 4294967295 - 1 + 1,结果为 4294967295