有符号数,符号位扩展
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。