#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型,这个好理解
*/
关于取反、移位、类型转换需要注意的一些问题
最新推荐文章于 2024-03-03 10:51:25 发布