负号如何存储?


13

我正在观看有关带符号整数的最大值和最小值的视频

以带正号的示例为例-0000 0001第一位表示数字为正,而最后7位表示数字本身。因此,很容易将其解释为+1。

现在以负符号值-1000 0000为例,结果为-8。好的,计算机可以理解这是一个负值,因为它的第一个比特,但是它如何理解000 0000表示-8?

通常,负符号值如何在计算机中存储/解释?


nl.wikipedia.org/wiki/Two%27s_complement是二进制数字在计算机中的存储方式。
Pieter B

@PieterB也许是您的计算机。还有很多其他人的 有充分的理由!但这并不意味着这是唯一的方法。
underscore_d

您喜欢的任何方式。我至少可以想到256个!在计算机上存储(8位)二进制数字的方式。但是,其中大多数都是非常愚蠢的。
卡莱斯(Caleth),

C没有指定,这很大程度上是芯片制造商决定代表数据的方式。C被编译为机器代码,因此请注意不要重新定义芯片存储数字的方式。相同的规则适用于浮点数。由芯片制造商来定义它们的存储方式。大多数芯片制造商使用2的补码,但是我敢肯定会有例外。
Berin Loritsch '19

Answers:


29

C标准没有强制采用任何特定的方式来表示负号。

在您可能会遇到的大多数实现中,负号整数存储在所谓的二进制补码中。存储负号的另一种主要方式称为补码

N位数字的二进制补码x定义为2^N - x。例如,8位的二进制补码12^8 - 1,或者1111 1111。8位的二进制补码82^8 - 8,二进制为1111 1000。也可以通过翻转的位x并加1 来计算。例如:

 1      = 0000 0001
~1      = 1111 1110
~1 + 1  = 1111 1111
-1      = 1111 1111

 21     = 0001 0101
~21     = 1110 1010
~21 + 1 = 1110 1011
-21     = 1110 1011

N位数字x的一个补码基本上定义为x,所有位都翻转了。

 1      = 0000 0001
-1      = 1111 1110

 21     = 0001 0101
-21     = 1110 1010

补码相对于补码有几个优点。例如,它没有“负零”的概念,这有充分的理由使许多人感到困惑。加,乘,减与带二的补码有符号整数的工作原理相同,无符号整数也是如此。


19

有三种众所周知的以二进制表示负值的方法:

  1. 签名幅度。这是最容易理解的,因为它的工作方式与处理负十进制值时的习惯相同:第一个位置(位)代表符号(0代表正,1代表负),其他位代表数字。尽管我们很容易理解,但计算机很难使用,尤其是在对负数进行算术运算时。
    在8位带符号幅度中,值8表示为0 0001000,而-8表示为1 0001000。

  2. 一个人的补语。在这种表示方式中,通过翻转所有位而不仅仅是符号位,从相应的正数创建负数。这使得为​​计算机处理负数更加容易,但是复杂的是+0和-0有两种不同的表示形式。所有位的翻转使人类更难理解。
    在8位补码中,值8表示为00001000,而-8表示为11110111。

  3. 补码。这是当今用于负整数的最常见表示形式,因为它最容易在计算机上使用,但对人类来说也最难理解。当比较一个人的补码和两个人的补码之间用于负值的位模式时,可以观察到,两个人的补码中的相同位模式编码下一个较低的数字。例如11111111代表一个人的补码中的-0和代表两个人的补数中的-1,同样代表10000000(-127对-128)。
    在8位二进制补码中,值8表示为00001000,而-8表示为11111000。


8
有符号的幅度也有两个零。
约尔格W¯¯米塔格

+1表示符号/大小。不常见且不便(对于CPU,如果不是人类的话!),但值得了解。
underscore_d

我们几乎所有人都使用带符号的幅度工作,尤其是使用FP编号。
Paulo1205'9

2

带符号的整数使用http://en.wikipedia.org/wiki/Two%27s%20complement存储

然后您得到:

000   0
001   1
010   2
011   3
100   -4
101   -3
110   -2
111   -1

基本上,这很容易计数,您可以计数到有符号整数的最大值的一半。进行+1,使其为负数,然后开始递减计数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.