根本矛盾是位数造成的,在高级语言看来a是8位的,但是在寄存器中是以16位存储的,如果是8位右移,高位补充的是0,如果是16位右移,高位补充的是1,所以最终结果不一样
unsigned char
类型占用1个字节,8个bit位10100101
之前还有8个0如果对你有帮助,还请点个采纳,万分感谢!
具体原因,书上已经提到:
你这本书写的有点老了。
按位逻辑运算和位移运算都会先把操作数进行整型提升(Integral promotion)为然后再计算。
比如char
, unsigned char
都会被提升为int
类型,
有符号类型进行整型提升时按有符号扩展,即如果符号位(最高位)是1,扩展时补1;如果符号位是0,扩展时补0
无符号类型进行整型提升时按零扩展,即不管最高位是0还是1,扩展时都补0
详情请参考下面链接
https://en.cppreference.com/w/cpp/language/operator_arithmetic
https://en.cppreference.com/w/cpp/language/implicit_conversion#Integral_promotion