uint32_t 至 int64_t 转换

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

问题代码:

#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值