事情的发生:
某日工作中有个需求是将不同的数值存到char的前4位和后4位中。
恰好同事中有同样取得32位int的前8位当成一个数值的代码:
//取得32位中的高八位组成的值
#define U32_HIGH_8(val) ((val >> 24) & 0X000000FF)
好奇心就来了,在右移24位以后是否还有必要再与上(&)0x000000FF将高位的数据彻底清零呢?
讨论:
考虑以下几个问题:
(1)
char i = 0x40; //二进制中i的表示为:0100 0000
unsighedchar j = 0x40;
i<<= 1;
j<<= 1;//问:i和j分别等于多少?
i 左移以后的二进制表示为:1000 0000,由定义的有符号char解释为:i = -128
j 左移以后的二进制表示为:1000 0000,由定义的无符号(unsigned char)解释为:i = 128
(2)
char i = 0x80;//二进制中表示为:1000 0000
char j = 0x40;//二进制中i的表示为:0100 0000
j >>= 1;
i>>= 1;//问i和j等于多少?
i 右移以后的二进制表示为:1100 0000(右移对于负数来说符号位右移,高位补1),故i=-64<