看代码
short a = 5;
unsigned short b = 5;
cout << ~a << endl;
cout << (unsigned short)(~b) << endl;
printf("%hd\n", ~a); // 使用%hd格式符输出有符号short整数
printf("%hu\n", (~b)); // 使用%hu格式符输出无符号short整数
为什么会出现上面的结果呢,
使用位运算符~对一个数进行按位取反操作。对于有符号的short整数a,它的二进制表示为:
0000 0000 0000 0101
对a进行按位取反操作后,得到:
1111 1111 1111 1010
这个结果表示一个有符号整数,其值为-6。上面的编码就是 -6 的补码
对于无符号的unsigned short整数b,它的二进制表示同样为:
0000 0000 0000 0101
对b进行按位取反操作后,得到:
1111 1111 1111 1010
这个结果表示一个无符号整数,其值为65530。上面的编码就是65530的补码
因此,输出应该是:
-6
65530
这道题的关键就在于虽然编码是一样的,但是程序识别出是负数还是正数,正数的补码还是本身的原码,负数的补码就是原码取反加1.