【发布时间】:2018-08-10 09:06:38
【问题描述】:
我目前正在研究汇编,以及它们之间的位运算的工作原理。特别是算术右移困扰着我。
现在,我正在阅读的书中有几个练习题,其中,我需要对包含以下内容的字节执行此操作:
0100 0100
现在,当算术右移填充最高有效位的值时,在我看来这应该是正确的:
00001000
但是,书上说应该是
11101000
也就是说,从左边开始填充 1 而不是 0。但是最重要的位不是0吗?
嗯,还有一个:
0110 0100 >> 3 = 0000 1100
但是,显然这也是错误的,应该是:
11101100
再次,我不明白最重要的位值显然是 0,最左边的那个,但解决方案告诉我应该填写 1?
所以我在这里有一个显然是正确的最后一个:
0111 0010 >> 3 = 0000 1110
这是我所期望的。那么为什么其他这些不正确呢?
如果不理解这一点,阅读汇编非常困难,因为大量乘法和除法被编译为移位运算。
【问题讨论】:
-
哪本书? (书中确实会发生错误,这看起来像是一个错误,除非有更多的上下文来解释这种奇怪现象)。这应该是 2 的补码还是其他东西(比如一个补码)?但这并不重要;
0100 0100在 1 的补码中也是正数。是的,它应该移入零以产生与初始值具有相同符号的结果。 -
这本书(我觉得这本书很好)是:计算机系统一个程序员的观点,作者 Randal E. Bryant 和 David R. O'Hallaron 练习题是第 94 页的 2.16,给出了解决方案在第 184 页
标签: assembly bitwise-operators bit-shift