为什么 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 的补码符号扩展通过添加符号位的副本来工作? 的相关文章

  • MIPS 汇编不支持“.set noat”吗?

    目前 我正在学习GNU as 并在 info as 中找到了很多有用的信息 我发现 set noat 在MIPS指定的代码中使用 但是当在 info as 中搜索该指令时 我在节点 alpha指令 中找到了它的解释 但在 MIPS Depe
  • 为什么long long 2147483647 + 1 = -2147483648? [复制]

    这个问题在这里已经有答案了 为什么这段代码不打印相同的数字 long long a b a 2147483647 1 b 2147483648 printf lld n a printf lld n b 我知道int变量的最大数量是2147
  • 了解带有 pc 偏移的 Cortex-M 组件 LDR

    我正在查看这段 C 代码的反汇编代码 define GPIO PORTF DATA R volatile unsigned long 0x400253FC int main void Initialization code while 1
  • MAC-1 汇编递归

    如何在 MAC 1 汇编器中调用递归函数 在 C 中你会做类似的事情 int func int num if num 0 return 1 return num func num 1 我知道如何使用调用函数 CALL 以及如何将参数加载到堆
  • 如何创建一个扩展为“(x+y*240)*2”这样的表达式的 GNU GAS 宏?

    我正在使用 GAS 为 ARM Linux 构建一个程序 但我想做一些宏以使我的开发更加智能 然后我想知道 我怎样才能为此做一个宏 x y 240 2 were x and y are int 将像这样使用 mov r0 MACRO SHO
  • Python:二进制/十六进制字符串转换?

    我有一个同时包含二进制和字符串字符的字符串 我想先将其转换为二进制 然后转换为十六进制 字符串如下 lt 81 gt Q lt 81 gt Q G Q A S A V lt 83 gt Cd lt 80 gt lt 99 gt N A j
  • Haskell 二进制解析

    我一直在尝试在 haskell 中实现一个协议解析器 而且我对这门语言还很陌生 特别是当涉及到 monad 时 我一直在使用binary 0 5 0 2 并描述了协议的标头和所有有效负载 我想要解析的消息如下所示 header payloa
  • 为什么每次在 GDB 中构建和反汇编函数时都会得到相同的地址?

    每次反汇编函数时 为什么总是得到相同的指令地址和常量地址 例如 执行以下命令后 gcc o hello hello c ggdb gdb hello gdb disassemble main 转储代码将是 当我退出 gdb 并重新反汇编 m
  • 汇编:使用数据段寄存器(DS)

    目前我正在学习 x86 汇编 因为我喜欢微控制器编程 所以我熟悉汇编 目前我一直在到处寻找这个问题的答案 但似乎找不到它 DS寄存器 我知道它应该指向我程序中的全局数据 但我不知道知道它到底是如何工作的 我正在使用 NASM 在大多数简单的
  • 如何判断一个int数是奇数还是偶数? (二进制方式)

    我想利用基础知识来提高代码效率 我知道在二进制系统中 当数字的最后一位是 1 时 这是奇数 0 是偶数 在python中如何用这种方式判断一个int数 python 是否提供了任何内置方法来执行此操作 和 1 000010100100010
  • 段错误...关于你好世界

    这段代码非常简单 但我在 x86 64 Linux 系统上遇到了段错误 这让我很烦恼 刚开始接触asm 请耐心等待 与 NASM 组装nasm f elf64 test asm 与连接ld o test test o SECTION tex
  • 读取结构体定义的二进制文件

    有人可以指出我如何读取由 C 结构体定义的二进制文件的正确方向吗 它的结构内部有一些 define 这让我觉得它会让事情变得复杂 结构看起来像这样 尽管它比这更大 更复杂 struct Format unsigned long str to
  • 当我尝试在 Armv8 程序集中分配数组时,执行冻结

    所以我正在用汇编语言进行编程 这只是一个简单的代码 这样我就可以学习如何分配数组 以便稍后在 NEON 编程中使用它们 ASM FUNC FPE data balign 8 array skip 80 array1 word 10 20 3
  • Java 将两个 int 存储在 long 中

    我想将两个整数存储在一个 long 中 而不是必须创建一个新的Point每次都反对 目前 我尝试过这个 它不起作用 但我不知道它出了什么问题 x and y are ints long l x l l lt lt 32 y 我得到的 int
  • 如果没有按下任何键,则检查按键而不阻塞

    我正在创建一个应用程序来查看当前时间 并创建了一个循环来每秒更新时间 循环看起来像这样 UPDATE The code to be re executed JMP UPDATE 但我无法结束它 当我使用 MOV AH 00H INT 21H
  • Mac OS X 上的 64 位程序集运行时错误:“dyld:无可写段”和“Trace/BPT trap”

    当尝试运行以下汇编程序时 globl start start pushq 0x0 movq 0x1 rax subq 0x8 rsp int 0x80 我收到以下错误 dyld no writable segment Trace BPT t
  • 将浮点数 1864.78 转换为二进制和 IEEE 格式

    我一直在尝试将 S P 500 的值 今天为 1864 78 转换为它在内存中以 IEEE 单精度格式表示的方式 转换小数点左边 1864 很容易 11101001000 但如何获得十进制 78 的二进制表示形式呢 我尝试使用该技术 但它会
  • PHP:将字符串分成 8 个块,我该怎么做?

    我基本上有二进制 假设它的长度是300 我如何将它分割 就像使用爆炸一样 成 8 位块 我查看了 chunk split 但它似乎只有一个 end 参数 而不是将其放入数组的选项 或者它可以插入数组吗 末尾 8 位数字可以低于 8 如果有人
  • 内存映射图形输出

    我正在探索使用内存映射图形绘制像素和线条 我在 Windows 的 Textpad 中使用 TASM 当我单击 运行 时 整个屏幕变成蓝色 就是这样 没有绘制像素 model small stack data saveMode db xVa
  • 如何计算 3D Morton 数(交织 3 个整数的位)

    我正在寻找一种快速计算 3D Morton 数的方法 这个网站 http www graphics stanford edu seander bithacks html InterleaveBMN有一个基于幻数的技巧来处理 2D Morto

随机推荐

  • 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