基本上,程序计数器可能有无符号的int值:
例如,如果PC是0b11110000(240)
,那么我们认为它是240,而不是负值。
但是,如果我们将偏移(符号扩展)添加到PC(0b11110000)
以上,则附加值可以是负数或正数:
例如,如果我们将0b11111001(-7)添加到PC 0b11110000(240),则PC应该具有233(这意味着我们在无符号和有符号之间添加操作)。但是,如果偏移是正值,则PC 0b11110000(240) + offset 0b00001111(15)= 255(这意味着我们在无符号和有符号之间添加操作)
如何在无符号和签名之间添加操作?
答案 0 :(得分:1)
关于two's complement算术的一个好处是它对有符号和无符号量都能保持一致。事实上,在很多时候,CPU并不知道/关心它是在有符号数量还是无符号数量上运行 - 直到某一点(尤其是加法和减法),这主要是解释的问题。
你问了大约240 + -7和240 + 15.我们来看看签名域和未签名域中的这两个问题:
unsigned + signed:
240 + -7 = 233
240 + 15 = 255
unsigned + unsigned:
240 + 249 = 233(489%256)
240 + 15 = 255
签名+签名:
-16 + -7 = -23
-16 + 15 = -1
签名+无符号:
-16 + 249 = -23
-16 + 15 = -1
这里发生了什么?好吧,233 unsigned与-23签名相同:它们都是11101001(8位)。在二进制文件中,这两个问题看起来像这样:
11110000 + 11111001 = (1)11101001
11110000 + 00001111 = 11111111
第一个结果溢出:它真的是111101001(489),但它溢出并且我们丢失了第9位,导致11101001(233)。
其余的都是解释。 11110000
是-16签名,或240未签名。 11111001
是-17签名,或249未签名。 11101001
是-23签名,或233未签名。 11101111
是-1签名,或255无签名。 00001111
始终为15。
(所有这些都假设是两个补码。在一个补码或符号/幅度上,情况会有所不同。但是两个补码是你的计算机使用的。)