我正在观看有关带符号整数的最大值和最小值的视频。
以带正号的示例为例-0000 0001第一位表示数字为正,而最后7位表示数字本身。因此,很容易将其解释为+1。
现在以负符号值-1000 0000为例,结果为-8。好的,计算机可以理解这是一个负值,因为它的第一个比特,但是它如何理解000 0000表示-8?
通常,负符号值如何在计算机中存储/解释?
我正在观看有关带符号整数的最大值和最小值的视频。
以带正号的示例为例-0000 0001第一位表示数字为正,而最后7位表示数字本身。因此,很容易将其解释为+1。
现在以负符号值-1000 0000为例,结果为-8。好的,计算机可以理解这是一个负值,因为它的第一个比特,但是它如何理解000 0000表示-8?
通常,负符号值如何在计算机中存储/解释?
Answers:
C标准没有强制采用任何特定的方式来表示负号。
在您可能会遇到的大多数实现中,负号整数存储在所谓的二进制补码中。存储负号的另一种主要方式称为补码。
N位数字的二进制补码x
定义为2^N - x
。例如,8位的二进制补码1
的2^8 - 1
,或者1111 1111
。8位的二进制补码8
为2^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
补码相对于补码有几个优点。例如,它没有“负零”的概念,这有充分的理由使许多人感到困惑。加,乘,减与带二的补码有符号整数的工作原理相同,无符号整数也是如此。
有三种众所周知的以二进制表示负值的方法:
签名幅度。这是最容易理解的,因为它的工作方式与处理负十进制值时的习惯相同:第一个位置(位)代表符号(0代表正,1代表负),其他位代表数字。尽管我们很容易理解,但计算机很难使用,尤其是在对负数进行算术运算时。
在8位带符号幅度中,值8表示为0 0001000,而-8表示为1 0001000。
一个人的补语。在这种表示方式中,通过翻转所有位而不仅仅是符号位,从相应的正数创建负数。这使得为计算机处理负数更加容易,但是复杂的是+0和-0有两种不同的表示形式。所有位的翻转使人类更难理解。
在8位补码中,值8表示为00001000,而-8表示为11110111。
补码。这是当今用于负整数的最常见表示形式,因为它最容易在计算机上使用,但对人类来说也最难理解。当比较一个人的补码和两个人的补码之间用于负值的位模式时,可以观察到,两个人的补码中的相同位模式编码下一个较低的数字。例如11111111代表一个人的补码中的-0和代表两个人的补数中的-1,同样代表10000000(-127对-128)。
在8位二进制补码中,值8表示为00001000,而-8表示为11111000。
带符号的整数使用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,使其为负数,然后开始递减计数。