如何知道您的十六进制加法作为有符号整数是否正确?

How to know if your Hex addition is correct as a signed integer?

我无法理解什么是 "correct" 并且在使用十六进制值进行加法和减法时不正确,就带符号的表示形式而言。我想指出,我将处理 BYTE 大小的数据。

例如,当我添加 6C(十六进制)+ 7D(十六进制)时,我得到答案 E9(十六进制)。现在,从我的角度来看,我知道 E9 作为无符号整数是正确答案。 108 (6C) + 125 (7D) = 233 (E9)

但是,当我尝试确定这是否是作为签名答案的正确答案时,我的问题出现了...

我应该考虑 INITIAL 加法的逻辑吗?? (并说明 E9 是不正确的,因为 6C(正数)+ 7D(正数)不能等于 E9(符号符号中的负数),因为添加 2 个正数不能得到负数..)

... 或者我应该说 E9 不正确因为它超出范围 [-128,+127]

.. 或者我应该完全不同地看待它,取 7D 的 2 的补码并从 6C 中减去它,看看这个答案是否合适,以确定它是否正确?

基本上,我只需要指出正确的方向即可确定答案的签名版本是否正确。我喜欢这些类型事情的分步说明,但我的汇编语言书帮助不大。

二进制加法没有符号与无符号的概念。完全相同的位模式。这些位模式的含义在旁观者的眼中(乘法和除法是不正确的)。这就是二进制补码的妙处。

0xF0 + 0x02 = 0xF2 = 240 + 2 = 242 
0xF0 + 0x02 = 0xF2 = -16 + 2 = -14 

减法让生活更轻松

A - B = A + (-B) = A + (~B) + 1

现在加法和减法的有符号和无符号溢出定义不同。因此,对于有符号数或无符号数,是否得到 "right" 答案取决于是否溢出。

编辑

6C + 7D = E9 
108 + 125 = 233
108 + 125 != -23

是的,存在有符号溢出,如果您将这些视为有符号数,那么您就溢出了,答案是错误的,如果您将这些视为无符号数,那么您没有无符号溢出,答案是正确的。

无符号溢出就是进位,如果结果需要9位1xx那么就是无符号溢出。对于有符号溢出,如果 msbit 的进位和 msbit 的进位(或者另一种说法是,如果 msbit 的进位和进位不匹配,则它是有符号溢出)。您可能有意选择了使这变得非常容易的数字。两个操作数的 msbit 都是 0,进位是 1,因为如果这些是 7 位数字,那将是进位。所以 msbit 的进位是 1,操作数是 0 和 0 1+0+0 = 1,进位是 0,所以进位是 1,进位是 0,有符号溢出。如果您进行分析,另一种测试有符号溢出的方法是,如果两个操作数的 msbit 相同而结果的 msbit 不相同,那么这就是有符号溢出。

基本上这就是真相table

abi or
000 00
001 01 v
010 01  
011 10
100 01
101 10
110 10 v
111 11

a和b是操作数的msbits,i是进位,r是结果o是进位,如果i和0不匹配就是有符号溢出。发生这种情况的两种情况也是a = b和b != r

的两种情况

所以你的两个数字看 msbits 是 0 0 1,操作数匹配结果不匹配,有符号溢出如果这是有符号加法那么它失败你不能用可用位数表示答案。

在大多数汇编语言中,您通过检查标志寄存器中的溢出标志(通常称为 O 或 OF 或 V,取决于体系结构)来检查有符号整数溢出。任何时候你做一个算术运算,如果有符号整数溢出(如果结果不是正确的有符号整数结果),OF 将被设置,如果没有溢出,OF 将被清除。

在x86上,这个flag叫做OF,你可以用条件分支指令检查它(JO溢出跳转,或者JNO没有溢出跳转),或者你可以使用INTO溢出陷阱,或 SETO 以根据溢出设置寄存器的值。