assembly - 通过添加两个十六进制数字,需要找到标志 Z、N、V 和 C。我发现 Z、N、C 标志是正确的,但 V 应该是 0 而不是 1。为什么?
问题描述
FA +AB =A5 (1 进位, 1A5) C=1
A5=A*16+5*16^0=165(不在-127-128之间所以我认为它是溢出并且V=1但正确答案是V=0)
其他答案正确:A5= 1 0100101,表示 N 标志为 1。此外,Z 标志为 0,因为 A5 与数字 0 不同。
解决方案
FA + AB
0
11111010
+10101011
==========
111110100
11111010
+10101011
==========
10100101
操作数的 msbits 相同,结果与这些操作数相同,因此它不是有符号溢出。另一个等效测试是 msbit 的进位和进位相同(均为 1),因此没有符号溢出。
0xFA + 0xAB = 0xA5
-6 + -85 = -91
这不是签名溢出。
N 被设置,因为答案的 msbit 被设置,C 因为进位而被设置(无符号溢出是正确的 250 + 171 = 421 )。答案不为零,所以 Z = 0。
编辑
V 位是 SIGNED 溢出位,它只有在程序员认为这些位是有符号的时才有意义。(对于加法和减法,逻辑并不关心/知道有符号与无符号的逻辑是相同的,这就是二进制补码的美妙之处)。
01111111 127
....
00000100 4
00000011 3
00000010 2
00000001 1
00000000 0
11111111 -1
11111110 -2
11111101 -3
....
10000001 -127
10000000 -128
当您的程序员考虑要对位进行签名并使用二进制补码(甚至符号/大小)时,当您看到 msbit 集时,这意味着该数字为负数。所以我们在这个问题中假设你在谈论 8 位数字,所以当认为有符号数字时 0xFA 是负数,我如何计算出十进制的内容是反转并加一个然后转换为十进制。
所以 0xFA 到 0x05 然后添加一个 0x06 转换为十进制并添加一个负号所以 -6 0xAB 然后是 0x54+1 (根据经验,您可以简单地查看十六进制数并将其反转并写入倒数)或 0x55 然后我使用我的计算器-85。-6 + -85 十进制是 -91,可以用 8 位表示,因为 8 位有符号,可以表示 +127 和 -128 之间,-91 落在那个范围内,所以没有 SIGNED 溢出。
我们需要取二进制补码,因为我们从小就思考十进制并且希望将数字视为十进制,因此您使用上述过程,另一种方法是在我的计算器中输入 FFFFA,然后在十六进制模式下取反并得到一些 ffs 一些 00s 然后 6所以 0x06,一种更快的方法,在我的计算器上,然后重新输入 06 并转换为十进制。FFFFAB(根本不需要签名扩展它,只是在我这样做时帮助我)给出 55 然后转换为十进制并取反。
所以我们为什么要这样做是因为如果我们想在我们的十进制头脑中理解它并且手动进行这就是我们所做的,否则在表格中查找它,使用程序等来“看到”负数,如果我们想以十进制“查看”它,那么对于正数也是如此,如果 msbit 为 0,我们按原样转换它,如果 1 然后反转加一,然后转换它并在其上加上一个负号。处理器没有理由这样做,它希望位保持原样,只有当我们想查看处理器在做什么时,我们才喜欢用十进制来思考。
推荐阅读
- scala - 如何用 ZIO 解释最终的无标签 DSL?
- linux - For循环选择字符串变量的特定部分
- sql - 返回值不存在的所有数据
- c# - 从 JWT 获取自定义声明的值
- python - 根据其他两列的值在 Pandas 中创建一个新列
- docker - .env 文件更改后,dotenv celery docker 容器未立即更新
- angular - 将 CdkOverlay 放在 angular/elements webcomponent 内
- unity3d - 将视图的一部分保存为材质?(Unity3D)
- python - (只是一个快速的声明,我是一个完整的编程初学者)我不断收到这个语法错误:SyntaxError: EOL while scanning string literal
- java - 使用 JPA AttributeConverter 将类转换为几何