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

转载链接: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型,这个好理解
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值