Assembly 关于二进制数的查询

Assembly 关于二进制数的查询,assembly,binary,numbers,Assembly,Binary,Numbers,我正在读一本关于汇编语言的书。我在那本书中偶然发现了这些句子 Consider the value “-64”. The eight bit two’s complement value for this number is 0C0h. The 16-bit equivalent of this number is 0FFC0h. 我听不懂这两句话。有人能告诉我-64的8位2的补码是0c0h吗?16位的等效值是0ffc0h吗?如果可能的话,请给我看一下计算结果。提前感谢。将一个负数想象成两个正

我正在读一本关于汇编语言的书。我在那本书中偶然发现了这些句子

Consider the value “-64”. The eight bit two’s complement value for this number is
0C0h. The 16-bit equivalent of this number is 0FFC0h.

我听不懂这两句话。有人能告诉我-64的8位2的补码是0c0h吗?16位的等效值是0ffc0h吗?如果可能的话,请给我看一下计算结果。提前感谢。

将一个负数想象成两个正数的减法可能会有所帮助,例如“0-64”

零是8位的
00h

减去
1
,您将得到
FFh

再减去
1
,您将得到
FEh

继续这种模式62次,您将处于
C0h


请在16位中再次尝试该模式,记住从
0000h
中减法一是
FFFFh

将负数想象为两个正数的减法,例如“0-64”

零是8位的
00h

减去
1
,您将得到
FFh

再减去
1
,您将得到
FEh

继续这种模式62次,您将处于
C0h

在16位中再次尝试该模式,记住从
0000h
中减法一是
FFFFh

+64=%0100\u 0000
-64=%1011\u 1111+1=%1100\u 0000=0xC0
当您获取8位有符号2的补码并将其扩展到16位时,必须对其进行符号扩展(将符号位复制到所有新的HO位)

这使得-64=%1111\u 1111\u 1100\u 0000=0xFFC0

+64=%0100\u 0000
-64=%1011\u 1111+1=%1100\u 0000=0xC0
当您获取8位有符号2的补码并将其扩展到16位时,必须对其进行符号扩展(将符号位复制到所有新的HO位)


这使得CPU中的-64=%1111\u 1111\u 1100\u 0000=0xFFC0

整数使用固定数量的二进制数字表示。例如,用八位二进制表示的64是
01000000

一般来说,负数用2的补码表示。要得到二进制数的两个补码,首先计算正数的一个补码(这意味着翻转所有位),然后加一

例如,要计算二者的补码-64,请从二进制中的64开始:

01000000 then flip all the bits to get one's complement
10111111 then add one, ignoring the final carry (i.e. overflow)
11000000
11000000
是十六进制的
C0

可以使用16位执行相同的过程:

00000000 01000000 (64)
11111111 10111111 (one's complement of 64)
11111111 11000000 (one's complement of 64 plus one)
11111111000000
十六进制是
FFC0


2的补码用于负数的原因是它消除了特殊情况。一个负数和一个正数通常可以相加,得到正确的答案。例如,8位2的补码中的-1是
11111111
。将一加上它会正确地返回零(
11111111
+
00000001
=
00000000
),因为没有足够的位来保存进位。

CPU中的整数使用固定数量的二进制数字表示。例如,用八位二进制表示的64是
01000000

一般来说,负数用2的补码表示。要得到二进制数的两个补码,首先计算正数的一个补码(这意味着翻转所有位),然后加一

例如,要计算二者的补码-64,请从二进制中的64开始:

01000000 then flip all the bits to get one's complement
10111111 then add one, ignoring the final carry (i.e. overflow)
11000000
11000000
是十六进制的
C0

可以使用16位执行相同的过程:

00000000 01000000 (64)
11111111 10111111 (one's complement of 64)
11111111 11000000 (one's complement of 64 plus one)
11111111000000
十六进制是
FFC0


2的补码用于负数的原因是它消除了特殊情况。一个负数和一个正数通常可以相加,得到正确的答案。例如,8位2的补码中的-1是
11111111
。将一加上它会正确地返回零(
11111111
+
00000001
=
00000000
),因为没有足够的位来保存进位。

我将使用下标作为基,而不是任何编程语言的语法。首先是正数

+6410=+4016

负数的两个补码表示为该数的位补码加1。在8位中

-(4016)=~(4016)+1=BF16+1=C016

正如你的书所说。要获得16位表示,请将8位表示的最高位复制到所有较高的位(这称为符号扩展):

4016=004016
C016=FFC016


您必须从上下文中知道符号扩展还是零扩展是合适的。没有上下文的C016是不明确的:它可以是-6410或+19210。如果是后者,它应该是零扩展到00C016,而不是符号扩展到FFC016。

我将使用下标作为基,而不是任何编程语言的语法。首先是正数

+6410=+4016

负数的两个补码表示为该数的位补码加1。在8位中

-(4016)=~(4016)+1=BF16+1=C016

正如你的书所说。要获得16位表示,请将8位表示的最高位复制到所有较高的位(这称为符号扩展):

4016=004016
C016=FFC016


您必须从上下文中知道符号扩展还是零扩展是合适的。没有上下文的C016是不明确的:它可以是-6410或+19210。如果是后者,则应将其零扩展到00C016,而不是将符号扩展到FFC016。

想象一台使用无限位数作为整数的机器。假设从一个数字中减去一个,该数字最右边的“k”位均为零,下一位为“1”。最右边的“k”零将全部变为1,下一位将变为零

现在假设对于某些“k”,最右边的“k”位是零,而nex是零