图片中第一行执行出来为什么是-14,13按位取反1101取反0010,这不应该是2吗?

m0_58492601 下午好🌅🌅🌅
本答案参考通义千问
在C++中,当你对一个整数进行按位取反操作时,结果会受到其原码表示的影响。对于有符号整数,负数的二进制表示使用补码表示法,其中最高位为符号位,0表示正数,1表示负数。
在你的例子中,-14的二进制形式是1110(因为它是8位的,但只有3个有效位,因为最低位是符号位),然后进行按位取反得到0001。但是,这并不是直接转换为十进制的2,因为0001在有符号整数中代表的是-1,而不是2。
解决方案:
理解有符号整数的表示法: 对于有符号整数,补码表示法意味着负数的按位取反后不是简单地将每一位取反,而是将最高位(符号位)保持不变,其他位取反。
计算实际值: 在二进制下,1110取反后变成0001,由于最高位是1,所以这表示一个负数。在8位有符号整数中,0001对应的十进制值是-1,不是2。
如果你想要计算无符号整数的按位取反,你应该先将其转换为无符号整数再进行操作,或者直接使用无符号整型数据类型。例如:
#include <iostream>
using namespace std;
int main() {
int s = -14; // 有符号整数
unsigned int u = s; // 转换为无符号整数
unsigned int inverted_u = ~u; // 按位取反
cout << "Unsigned: " << inverted_u << endl; // 输出:65535 (11111111)
return 0;
}
在这个例子中,~u的结果是65535,这是-14的无符号补码表示,按位取反后相当于所有位取反后移出最高位的符号位。