关于取反、移位、类型转换需要注意的一些问题

#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型,这个好理解
*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值