math - 如何将无符号数从有符号数转换为无符号数(二进制和十六进制)?

标签 math assembly binary hex

所以我正在尝试从 Randall Hyde 的书中学习汇编语言:汇编语言的艺术,我已经完成了第一章的学习,现在我正在尝试做练习。 我有以下问题:如何转换二进制值(正或负) 转换为相反符号的十六进制值。是的,我知道如何用二进制表示从 0 到 15 的数字,而且 10 是 f 等等...... 我遇到的问题如下..我得到了这个数字:1001 1001,我必须将它转换成相反的值。到目前为止,我已经使用了二进制补码并获得了这个:

1001 1001 ----->shifting bits -----> 0110 0110
                add 1         -----> 0110 0111

我应该得到第一个数字的相反数。相反,当我计算结果的值时,我得到这个:

1001 1001 = 2^0+2^3+2^4+2^7 = 1+8+16+128 = 153 (which in my opinion is fine...)

转换数字后我得到这个:

0110 0111= 2^0+2^1+2^2+2^5+2^6 = 1+2+4+32+64 = -103

我做错了什么?

最佳答案

您的术语有点不对。您想要翻转位(您已经这样做了),而不是“移动”它们(这是您稍后会学到的内容。

是什么让您认为自己做错了什么?一个数 x 的负数是另一个数 y 使得 x + y = 0。让我们看看您的两个数字并将它们相加:

  1001 1001
+ 0110 0111
-----------
  1111 1112
          ^ oops, 2 should be 10, so record 0 and carry the 1

  1111 1110
+        10 
-----------
  1111 1120
         ^ oops, 2 should be 10, so record 0 and carry the 1

如果你继续携带 1,你能看到这会结束吗?

这里要吸取的教训是,为了解释一个数字,您需要知道它是否打算成为一个带符号的数字。如果它是一个带符号的数字并且设置了符号位,那么为了将它转换为人类输出,你应该首先取反这个数字,使其为正数,然后输出一个负号和一个正数。

关于math - 如何将无符号数从有符号数转换为无符号数(二进制和十六进制)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13234718/

相关文章:

macos - 程序集 - 无法设置断点 lldb

c - C中的十进制整数到二进制

c++ - 3D分离轴定理,测试什么轴?

iphone - 如何计算等轴测图上两点之间的实际距离?

python 矩阵线性微分方程

gcc - Gdb 在调试 ARM7 微 Controller 的汇编程序时跳过源代码行

计算 n!当 m 不是素数时 mod m

c - 任务: Rewrite X86-assembler program in C

git - 使用 Git 或其他 VCS 管理 PDF/二进制文件

C++ 和二进制文件 - 新手问题