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
相关产品推荐
相关产品推荐

