为什么 2 的补码符号扩展通过添加符号位的副本来工作?

2024-02-08

我们以将 16 位有符号数符号扩展为 32 位寄存器为例,例如mov $+/-5, %ax movswl %ax, %ebx.

有两种可能的情况:

  1. 高位为零(数字为正)。这是非常容易理解和直观的。例如,如果我有号码5,左填充零非常容易理解。例如:

                      00000000 00000101    # 5 (represented in 16 bits)
    00000000 00000000 00000000 00000101    # 5 (represented in 32 bits)
    
    
  2. 然而,对我来说最难理解的是当它是负数并且我们进行符号扩展时。例子:

                      11111111 11111011    # -5 (represented in 16 bits)
    11111111 11111111 11111111 11111011    # -5 (represented in 32 bits)
    

是的,我知道我们只需将高位填充为1。但是什么让它发挥作用呢?也许对二进制数的“属性”的解释可以帮助我更好地理解这一点。


For an n+1-位2的补码数:

  • 高位(符号位)有位值-(2^n)
  • 下一个最高位具有位置值2^(n-1),依此类推(普通二进制位值)

例如,在 8 位 2 的补码中,仅包含 MSB 集的位模式表示值-128 = -(2^7)。设置前两位后,它代表-128 + 64 = -64.


当我们扩展 1 位时,原始符号位现在是带有位置值的“常规”位+(2^n)代替-(2^n),所以现有位表示的值现在是2^n + 2^n = 2^(n+1)高于原始值。 (或者如果该位为零则相同)。

新符号位的位值为-(2^(n+1)),因此复制原始符号位正是我们平衡位值变化所需的。 (或者如果为零则保持不变)。

当然,一位的过程可以通过重复任意数量的位来概括。

(通常我们会使用n= 总位数,例如对于 8 位 2 的补码,n=8 而不是 n=7。那么MSB的位值为-2^(n-1),并通过用新的符号位扩展来改变其含义添加2^n如果已设置。)


有关位如何表示值的更多信息,请参阅维基百科:https://en.wikipedia.org/wiki/Two%27s_complement#Converting_from_two's_complement_representation https://en.wikipedia.org/wiki/Two%27s_complement#Converting_from_two%27s_complement_representation- 2的补码文章相当不错,但没有详细介绍why复制符号位有效。

您还可以在纸上尝试一些小示例,例如符号从 4 位扩展到 5 位。-1(全一)将是一个很好的开始值,使数学变得简单。或者0b1000(-8) 是另一个不错的选择。

谷歌发现https://andybargh.com/binary-sign-extension/ https://andybargh.com/binary-sign-extension/它通过一个 8 位示例来工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 2 的补码符号扩展通过添加符号位的副本来工作? 的相关文章

随机推荐

  • zsh 别名 -> 函数?

    假设我有 alias gg git grep 然后是这样的东西 gg int x 有效 但是 gg int x 收到投诉 有没有办法将 gg 重写为 zsh 中的函数 以便它获取 gg 之后的所有参数 并将它们填充到字符串中 Thanks
  • 如何动态删除空手道中的json密钥?

    我正在尝试根据条件删除一些 json 键 下面没起作用 def body if condition true remove body path1 path2 key or def body condition true remove bod
  • 从 Javascript 调用 Flex/AS3 回调

    我有一个 Javascript API 它应该可以与 GWT 和 Flex 一起使用 使用 FABridge 从 AS3 调用 Javascript 方法非常容易 反之亦然 但是 当我尝试在 Javascript API 中注册 AS3 方
  • 包含声明的闭包的类型错误不能与结果生成器“ViewBuilder”一起使用

    var body some View VStack alignment center func CheckInput lt here the error if name self showAlertC1 true else if check
  • Visual Studio Code 中 TypeScript 文件中的绝对模块路径解析

    我似乎无法说服 Visual Studio Code 解析绝对 TypeScript 模块路径 相对路径有效 但绝对路径无效 我希望 Visual Studio Code 能够解析来自 src文件夹上 This works when sou
  • jQuery UI 对话框(模态),防止任何回发

    如何在 jQuery UI 对话框中进行 ASP NET 提交按钮回发 实际上 我正在使用 UI 对话框模式 就像我们使用 Ajax 控件工具包的模式所做的那样 来更新存储在 gridview 控件中的数据值 我可以做所有事情 但无法使用
  • BLE 参数协商如何工作?

    我想知道当 中央 和 外围 设置不同的参数时 参数协商如何工作 我可能是错的 但根据我的理解 外围设备在连接时会发出更新请求 以设置连接的参数 然后中央决定是否批准 我不明白的是如何决定这些参数是否获得批准 而且我还没有找到任何代码 例如
  • PowerShell - 为加载的程序集设置别名

    我使用这段代码来加载 Net汇编到 PowerShell System Reflection Assembly Load System Windows Forms Version 2 0 0 0 Culture neutral Public
  • 向 Python Swig 模板类添加新方法

    我需要向我的 swig 模板类添加一个新方法 例如 我在 myswig i 中声明一个模板类 如下所示 template DoubleVector vector
  • 无法滚动到溢出容器的弹性项目的顶部

    在尝试使用 Flexbox 制作有用的模式时 我发现似乎是浏览器问题 并且想知道是否有已知的修复或解决方法 或者关于如何解决它的想法 我试图解决的问题有两个方面 首先 使模态窗口垂直居中 这按预期工作 第二个是让模态窗口在外部滚动 因此整个
  • 如何更改 QTabWidget 中的文本对齐方式?

    我找不到在 QTabWidget 中设置文本对齐方式的方法 创建此小部件的实例后 我设置了其选项卡位置属性为西方 但我希望它水平显示文本 标签 我已经看过 Qt 的了样式表 https doc qt io qt 4 8 stylesheet
  • 在 VS Code 中创建自定义 HTML 片段

    我正在远离织梦者 我知道它很糟糕 但它有它的用处 用于 VS Code 的电子邮件开发 Dreamweaver 提供的一项方便的功能是使用自定义片段 VS Code 优惠自定义片段 https code visualstudio com d
  • Spring 的 ThreadPoolTask​​Executor 的默认队列大小是多少?

    我正在使用 Spring 4 3 8 RELEASE 和 Java 7 我想创建一个线程池来执行任务 所以我在 Spring contxet 中设置了以下内容
  • 如何获取子进程的退出状态?

    两个示例输出 由我的教授提供 是 这些在 Linux 终端中输入 ibrahim ibrahim latech prog2 Current working directory home ibrahim Executing ls all l
  • 使用 React 路由器以编程方式导航

    With react router我可以使用Link元素来创建由反应路由器本机处理的链接 我看到它内部调用this context transitionTo 我想做一个导航 不是来自链接 而是来自下拉选择 作为示例 我怎样才能在代码中做到这
  • usql 应用程序和脚本的单元测试

    我有一个自定义的 USql 应用程序 它扩展了IApplier class SqlUserDefinedApplier public class CsvApplier IApplier public CsvApplier totalcoun
  • 使用 Safari/Chrome 卸载时的 Ajax(或 JSONP)

    如果您尝试发送 Ajax 请求 JSONP 请求 甚至卸载时的 window name 请求 Safari 和 Chrome 会运行代码 但服务器永远看不到该请求 我的理论是执行线程在更改页面之前决不允许脚本标记运行 这是一个带有 JSON
  • 如何在javascript中获取托管bean属性值[重复]

    这个问题在这里已经有答案了 谁能告诉我如何在 javascript 方法中获取托管 bean 属性值 就像是 function fonction1 var variable myBean property 你可以喜欢这样
  • 如何在已加载的页面上生成并显示 TCPDF pdf?

    我正在尝试使用 TCPDF 即时生成 PDF 并将其显示在浏览器中 我已经 将 PDF 输出为下载文件 内联输出 PDF 无需任何 HTML 使用 pdf gt Output example 007 pdf I 我想做的是 输出内嵌已打印
  • 为什么 2 的补码符号扩展通过添加符号位的副本来工作?

    我们以将 16 位有符号数符号扩展为 32 位寄存器为例 例如mov 5 ax movswl ax ebx 有两种可能的情况 高位为零 数字为正 这是非常容易理解和直观的 例如 如果我有号码5 左填充零非常容易理解 例如 00000000