You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中~43运算结果为-44而非212的原因咨询

C++中按位取反~43结果异常的原因解析

先看你的代码:

#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
    char hjg = 43;
    cout << ~hjg;
        //43 -> 0010 1011
        //212 -> 1101 0100
}

1. 为什么输出结果是负数?

绝大多数编译器中,char默认是有符号类型(signed char),占用8位存储空间。执行按位取反操作~hjg时,会触发C++的整数提升规则:char类型会被自动提升为int类型(通常为32位)。

43的8位二进制是00101011,按位取反后得到11010100。由于原char是有符号类型,提升为int时会进行符号扩展——将最高位(符号位)填充到所有高位,最终32位二进制变为11111111 11111111 11111111 11010100,这是负数的补码形式,因此输出结果为负数。

2. 为什么结果是-44而非212?

手机计算器是把取反后的二进制11010100当作无符号8位整数计算,对应的十进制就是212。但C++中按有符号数处理:

  • 对于有符号数,补码11010100的真值计算逻辑是:先对补码取反得到00101011(十进制43),再加1得到00101100(十进制44),最终真值为-44。
  • 整数提升后,该值以32位有符号int形式输出,所以结果是-44。

如果想要得到212的结果,可以通过两种方式实现:

// 方法1:使用无符号char类型
unsigned char hjg = 43;
cout << ~hjg;

// 方法2:输出时强制转换为无符号类型
char hjg = 43;
cout << (unsigned int)~hjg;

内容的提问来源于stack exchange,提问作者gamefal 1820

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 11:38:31