转载链接:https://blog.csdn.net/qingkong8832/article/details/6754209
#include <iostream>
using namespace std;
void main()
{
unsigned char a=0xA5;
/*
char b=~a>>4;
cout<<int(b)<<endl;
*/
char b = ~a;
b = b >> 4;
cout<<(int)b<<endl;
}
/*
这道题短小而精悍,需要考虑的问题很多
(1)a=0xA5,对应数字为165;
(2)在最后打上断点,在监视中观察各中间变量可知,~a为int型,值为-166,说明在进行取反操作前,先把a转为int型。unsigned char型的a转为int型的十六进制表示为 00 00 00 a5(int为4个字节),取反后为ff ff ff 5a;
(3)向右移位为算术移位,即左边是补0还是补1,得看操作数为正数还是负数 ~a为负数(首位为1),那么~a>>4结果为ff ff ff f5(左边补1);
(4)之后int型的~a>>4要转为char型的b,只需要截取最后一个字节即可。得到b为f5。对应的十进制为多少呢?f5->1111 0101->(减1)1111 0100->(取反)0000 1011->为11,所以char b为-11。
(5)最后操作(int)b,需要把char型转为int型。这里得注意,转换之前为正,前面都补0, 之前为负,前面都补1。那么(int)b为ff ff ff f5,对应的即为-11。
ff ff ff f5->(减1)ff ff ff f4->00 00 00 0b
=====================================
监视中测试:
a 0xa5 165 unsigned char
~a 0xffffff5a -166 int
~a>>4 0xfffffff5 -11 int
(char)(~a>>4) 0xf5 -11 char
(int)((char)(~a>>4)) 0xfffffff5 -11 int
*/
/*
改成这样,可以得到目的,输出数字5。
char b = ~a;
b = b >> 4;
监视中测试:
a 0xa5 165 unsigned char
~a 0xffffff5a -166 int
char(~a) 0x5a 90 char
(char(~a))>>4 0x00000005 5 int
(char)((char(~a))>>4) 0x05 5 char
(int)((char)((char(~a))>>4)) 0x00000005 5 int
//注意:
(int)0xf5和(int)-11结果不同
(int)0xf5 0x000000f5 245
(int)-11 0xfffffff5 -11
因为
0xf5 0x000000f5
即系统默认0xf5为int型,前面补齐0,为正数。
改为(int)((char)0xf5)为-11
-11转为int型,这个好理解
*/