请教一下这是什么原因导致的结果与预期的不同?

img

根本矛盾是位数造成的,在高级语言看来a是8位的,但是在寄存器中是以16位存储的,如果是8位右移,高位补充的是0,如果是16位右移,高位补充的是1,所以最终结果不一样

  • 因为unsigned char类型占用1个字节,8个bit位
  • 前面的所有计算都是以8个bit位为基准计算的
  • 但实际上汇编语言里面会放进16个bit位的寄存器,原先的a10100101之前还有8个0
  • 所以取反~和右移的时候也会操作者前面的8个0
  • 最终结果就不一样了

如果对你有帮助,还请点个采纳,万分感谢!

具体原因,书上已经提到:

img


简单来说就是,
从高级语言看是8位,实际上在寄存器中是以16位存储的。
把8位变成16位,根据移位规律,这一移位,那一补位,你会发现结果就是这样。
以上仅供参考,希望对题主有所帮助!

你这本书写的有点老了。
按位逻辑运算和位移运算都会先把操作数进行整型提升(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