对一对有符号数和无符号数进行算术运算合法吗?

2023-11-25

我已经学习汇编了一半以上,并且熟悉有符号和无符号整数如何以位表示的概念,我知道这可能看起来是一个奇怪的问题,其答案是非常明显的,但我'我想知道使用像加法这样的算术运算对于一对数字是否有意义,其中一个被认为是有符号的,另一个被认为是无符号的,我想到了如下多个示例,它们将产生正确的结果:

10000001(1 字节整数,被视为无符号,相当于 129)
+
11111111(1 字节整数并被视为有符号(二进制补码系统),相当于 -1)


10000000(1 字节整数,无符号逻辑相当于 128)

现在,如果上限值在 AL 寄存器中,我们有以下指令代码(GAS 格式):

addb -1, %al

那么 EFLAGS 寄存器的进位标志(CF)将在操作完成后被设置,并通知实际上尚未发生的溢出,可能是因为溢出时存在一个无符号数,所以 EFLAGS 寄存器的溢出标志(OF)应予以参考。所以我很困惑这样做是否明智。


Mathematically, you do not add signed or unsigned number. There are only values modulo 232 (assuming that you have 32-bit registers). Such values cover a range of 232 consecutive integers, but you are free to interpret that range as beginning just about anywhere. "Signed" and "unsigned" are just two such interpretations.

In other words, with 4-bit registers, the unsigned interpretation of "1011" is eleven, while the signed interpretation is minus-five. But there is only one value (which mathematicians usually call "eleven modulo 24" because mathematicians are traditionally fond of unsigned interpretation). For instance, if you add "0110" to that value (which is "six" in both signed and unsigned interpretations), then you get "0001", which is the proper value: minus-five plus six yield one, and eleven plus six is seventeen which is also equal to one when reduced modulo 24 (seventeen is one plus sixteen; "reducing modulo 24" is about dividing by sixteen [that's 24] and keeping the remainder only).

另一种说法是:数值的(二进制)位数在概念上向左无限。 CPU寄存器只保留最右32位。按照惯例,无符号解释是假设所有最左边的位都为零。按照惯例,有符号解释是假设所有最左边的位都具有与位 31 相同的值(即全部为零,或全部为 1)。无论哪种方式,当您执行加法(或减法或乘法)时,进位从右到左传播,而不是相反,因此这些被忽略的位的值对 32 位结果没有任何影响。因此只有一个“add”操作码,它丝毫不关心其操作数在程序员的大脑中是“有符号”还是“无符号”。

Signedness must be taken into account when performing an operation which is not compatible with modulo arithmetics. Conversion into a sequence of decimal digits for display is such an operation. A more frequent case, however, is comparisons. Values modulo 232 are not ordered; they are in a kind of cyclic loop (when you add 1 to 232-1, and reduce modulo 232, you get back to 0). Comparisons make sense only when you consider integers in the whole range of integers. At that point, you must decide whether you use the signed or unsigned interpretation. Which is why x86 processors offer both jg (jump if greater, signed interpretation) and ja (jump if above, unsigned interpretation).

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

对一对有符号数和无符号数进行算术运算合法吗? 的相关文章

  • 大会,你好世界问题

    我正在 Linux 上学习 asm noobuntu 10 04 我得到了以下代码 http asm sourceforge net intro hello html http asm sourceforge net intro hello
  • ARMv8 A64 汇编中立即值的范围

    我的理解是 ARMv8 A64 汇编中的立即参数可以是 12 位长 如果是这样的话 为什么这行汇编代码是 AND X12 X10 0xFEF 产生此错误 使用 gcc 编译时 Error immediate out of range at
  • CPU寄存器和多任务处理

    我目前正在学习汇编 我很困惑 CPU 寄存器如何与多任务一起工作 所以在多任务系统中 CPU可以随时暂停某个程序的执行并运行另一个程序 那么在这一步中寄存器值是如何保存的呢 寄存器是压入堆栈还是以其他方式 CPU 寄存器如何与多任务一起工作
  • 如何使用movntdqa避免缓存污染?

    我正在尝试编写一个 memcpy 函数 该函数不会将源内存加载到 CPU 缓存中 目的是避免缓存污染 下面的 memcpy 函数可以工作 但会像标准 memcpy 一样污染缓存 我正在使用带有 Visual C 2008 Express 的
  • MikeOS 引导加载程序中的堆栈段

    我不明白这段代码 mov ax 07C0h Set up 4K of stack space above buffer add ax 544 8k buffer 512 paragraphs 32 paragraphs loader cli
  • 数学 - 映射数字

    如何将 a 和 b 之间的数字线性映射到 c 和 d 之间 也就是说 我希望 2 到 6 之间的数字映射到 10 到 20 之间的数字 但我需要广义的情况 我的脑子炸了 如果您的数字 X 位于 A 和 B 之间 并且您希望 Y 位于 C 和
  • FreePascal x64 上系统单元函数的汇编调用

    我有一些 Delphi 汇编代码 可以在 Win32 Win64 和 OSX 32 上编译并正常工作 XE2 但是 由于我需要它在 Linux 上工作 所以我一直在考虑编译它的 FPC 版本 到目前为止 Win32 64 Linux32 6
  • C 埃及分数

    古埃及人仅使用以下形式的分数1 n因此任何其他分数都必须表示为这些单位分数的总和 而且 所有单位分数都是不同的 在C或Java中使任何分数成为埃及分数 总和越少越好 的好方法是什么 可以使用什么算法 分支定界 a 例如 3 4 1 2 1
  • 这个按位运算如何检查 2 的幂?

    我正在看一些应该很简单的代码 但我的数学在这里严重失败 下面是一个使用以下条件检查数字是否为 2 的幂的条件 if num 1 num num 1 make num pow of 2 我的问题是 如何在 num 和 num 1 之间使用按位
  • 计算两点之间的最短路线

    过去几周我一直在开发一款多人 HTML5 游戏 使用nodejs and websockets 我已经被这个问题困扰了一段时间 想象一下 我用数组实现了这个平铺地图 如下所示 1 or 棕色瓷砖 路上有障碍物 玩家无法通过 0 or 绿色瓷
  • 在球体边缘绘制点

    因此 来自 Flash 背景的我对一些简单的 2D 三角函数有很好的理解 在带有 I 圆的二维中 我知道使用给定角度和半径将项目放置在边缘上的数学 x cos a r y sin a r 现在 如果我在 3d 空间中有一个点 我知道球体的半
  • 有 JavaScript 的微积分库吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有人知道 JavaScript 的微积分库吗 我做了一些谷歌搜索 但没有想出任何东西 我申请了 Wolf
  • R中整数类和数字类有什么区别

    我想先说我是一个绝对的编程初学者 所以请原谅这个问题是多么基本 我试图更好地理解 R 中的 原子 类 也许这适用于一般编程中的类 我理解字符 逻辑和复杂数据类之间的区别 但我正在努力寻找数字类和整数类之间的根本区别 假设我有一个简单的向量x
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • 从类模板参数为 asm 生成唯一的字符串文字

    我有一个非常特殊的情况 我需要为类模板中声明的变量生成唯一的汇编程序名称 我需要该名称对于类模板的每个实例都是唯一的 并且我需要将其传递给asm关键字 see here https gcc gnu org onlinedocs gcc 12
  • 正则表达式查找字符串中的整数和小数

    我有一个像这样的字符串 str1 12 ounces str2 1 5 ounces chopped 我想从字符串中获取金额 无论它是否是小数 12 或 1 5 然后获取紧邻的前一个测量值 盎司 我能够使用一个非常基本的正则表达式来获取测量
  • 这个方法比 Math.random() 更快吗?

    我是一名初学者 目前已经开始开发一款使用粒子群优化算法的 Android 游戏 我现在正在尝试稍微优化我的代码 并且 for 循环中有相当多的 Math random 几乎一直在运行 所以我正在考虑一种方法来绕过并跳过所有 Math ran
  • 添加冗余赋值可以在未经优化的情况下编译时加快代码速度

    我发现一个有趣的现象 include
  • NASM 中的 equ 和 db 有什么区别?

    len equ 2 len db 2 它们是否相同 产生可以用来代替的标签2 如果不是 那么每种申报表的优点或缺点是什么 它们可以互换使用吗 第一个是equate 与 C 类似 define len 2 因为它实际上并没有在最终代码中分配任
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我

随机推荐

  • NaN 上的宇宙飞船运算符

    在进行太空船比较操作时 C 如何处理浮点 NaN 我们知道通常的比较总是返回 false 那么 NaN 会如何改变呢 std numeric limits
  • iOS 6 应用程序 - 如何处理 iPhone 5 屏幕尺寸? [复制]

    这个问题在这里已经有答案了 可能的重复 如何开发或迁移适用于 iPhone 5 屏幕分辨率的应用程序 我只是想知道我们应该如何应对 iPhone 5 更大的屏幕尺寸 由于它的高度像素更多 像 GCRectMake 这样使用坐标的东西 并且只
  • 杀死java中的无限循环

    我正在使用第三方库来处理大量数据集 该过程偶尔会进入无限循环 或被阻塞 不知道为什么并且无法进入代码 我想在设定的时间后杀死它并继续下一个案例 一个简单的例子是 for Object data dataList Object result
  • 使用父模型获取填充嵌套集合

    我有以下带有嵌套集合的模型 var Mdl Backbone Model extend initialize function collection this col1 new NestedCollection 我想在一个请求中发送模型和集
  • 如何触发 JavaScript 事件点击

    我的页面中有一个超链接 我正在尝试自动点击超链接以进行测试 有什么方法可以使用 JavaScript 模拟超链接的 50 次点击吗 a href target blank MSDN a 我正在寻找来自 JavaScript 的 onClic
  • QuickCheckAll 始终返回“True”

    我正在尝试使用 QuickCheck 以下另一个答案 我这样测试 LANGUAGE TemplateHaskell import Test QuickCheck import Test QuickCheck All last a gt a
  • 继承模板方法

    我有一个类似于以下内容的课程 class SomeClass public template
  • bigmemory 和朋友的文件备份示例

    我有兴趣探索 R 如何处理内存不足的数据 我找到了bigmemory包裹和朋友 bigtabulate and biganalytics 但希望有人能给我指出一个使用这些包的文件支持的示例 任何其他内存不足的提示也将不胜感激 查理 只需发送
  • 在 R 中读取巨大的 json 文件,出现问题

    我正在尝试使用 R 读取非常大的 json 文件 并且我正在将 RJSON 库与此推荐一起使用json data lt fromJSON paste readLines myfile json collapse 问题是我收到此错误消息 Er
  • 编辑替代方案

    我有一大堆查询并使用levenshtein来计算拼写错误 现在levenshtein导致mysql占用完整的CPU时间 我的查询是 UNION 语句中的全文搜索 levenshtein sql1 是我当前的查询 sql2 只是全文搜索 速度
  • 如何将 flash (.swf) 文件嵌入到 asp.net 中?

    如何将 flash swf 文件显示到 asp net 中 从 YouTube 得到这个
  • Windows 8 的 WebClient 替代方案?

    I use WebClient获取 Windows Phone 8 和 Android 的 Yahoo 数据 HttpClient 使用 WebClient 我可以做 WebClient client new WebClient clien
  • 如何更新/重命名载波上传的文件?

    我不知道如何更新 重命名在 Rails 3 2 6 中使用 Carrierwave mongoid 上传 管理的文件 我想重命名数据库和文件系统中的文件 类似这样的事情也许 def rename id new name f Uploaded
  • 如何通过 NSArrayController 获得模型更改的通知?

    我有一个NSView绑定到的子类arrangedObjects of an NSArrayController 当数组插入或删除项目时 视图会收到通知 如果数组中存储的模型的属性发生更改 如何通知它 我是否需要将我的视图作为观察者添加到添加
  • 如何将nii格式文件转换为2D图像

    我有一个扩展名为 nii 的文件 我不知道如何将 nii 文件转换为 2D 格式 我的问题是在将 nii 文件转换为 2D 时 我是否会丢失有关该文件的一些信息 哪种格式好 dicom 或 png 或 bmp nii load nii im
  • Windows Phone 8 触摸支持

    Windows Phone 8 是否完全支持默认浏览器中的触摸事件 它是否可以开箱即用 以便网页可以检测到任意触摸移动事件 我遇到了一些浏览器的问题 这些浏览器劫持 touchmove 事件以作为滑动手势用于其界面 Windows Phon
  • 如何清除缓存的 UITableViewCell

    有人对如何清除缓存有建议吗UITableViewCell 我想使用reuseIdentifier 缓存这些单元格 但是 有时我需要删除或修改某些表行 我期望打电话reloadData行更改后 现在 dequeueReusableCellWi
  • 在表中插入数据之前是否可以获取 Id (IDENTITY) 的新值?

    在表中插入数据之前是否可以获取 Id IDENTITY 的新值 可以写这样的东西 INSERT INTO Table1 SELECT GET NEW IDENTITY Field1 Field2 FROM Table2 我需要 Id 的值
  • 在TreeSet中,基于不同属性的自定义对象的排序和唯一性

    下面是我的学生班级 class Student implements Comparable String name int rollNo Override public int compareTo Object obj return Stu
  • 对一对有符号数和无符号数进行算术运算合法吗?

    我已经学习汇编了一半以上 并且熟悉有符号和无符号整数如何以位表示的概念 我知道这可能看起来是一个奇怪的问题 其答案是非常明显的 但我 我想知道使用像加法这样的算术运算对于一对数字是否有意义 其中一个被认为是有符号的 另一个被认为是无符号的