有符号数,符号位扩展

char readbuf[64]; 

int data_size = (readbuf[7]<<24)|(readbuf[4]<<16)|(readbuf[5]<<8)| readbuf[6];

int data_size = (readbuf[7]<<24)+(readbuf[4]<<16)+(readbuf[5]<<8)+readbuf[6];

 readbuf :  09 00 3c 16 00 00 96 00 00 00 00

readbuf[6]=0x96, 十进制-106

因为 readbuf[6]是有符号数,虽然readbuf[7] 4 5都是0,但是转变成32位时,高位都扩展为符号位,所以不管是或还是加,data_size 都变成了 0xffffff96 (-106)

 十六进制相同的一个数,在有符号为负数时,有符号、无符号的移位操作的结果是不同的,有符号的高位将补F,而无符号的补0。

原文地址:https://www.cnblogs.com/mlj318/p/3835319.html