有意思的数值转换

发布时间 2023-08-31 18:25:47作者: strive-sun

在论坛上看见一个问题,比较有意思,记录下

原帖:

问题代码:

#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