AnT*_*AnT 14
在8位2的补数编码-128
,并+128
具有相同的表示:10000000
.因此,硬件设计者面临着一个明显的困境:如何解释位模式10000000
.在形式上,它将以任何一种方式工作.如果他们决定将其解释为+128
,则结果范围将是-127..+128
.如果他们决定将其解释为-128
,则结果范围将是-128..+127
.
在实际的2的补码表示中,选择后一种方法是因为它满足以下很好的约定:所有1
在高阶位中的位模式代表负数.
值得注意的是,语言规范不要求二进制补码实现将100...0
位模式视为任何有符号整数类型中的有效值.例如,允许实现将8位限制signed char
为-127..+127
范围并且将其10000000
视为无效位组合(陷阱表示).
我认为一个简单的方法来解释这个共同的灵魂是:
的位是一个值0
或1
,或2点的可能性
A 2位保持两个组合或0
和1
用于四个可能的值:00
,01
,10
,和11
.
3位保存三种组合,总共有八种可能的值:000
to 111
.
因此,n位保持n个组合,总共2 ^ n个可能的值.因此,8位值是2 ^ 8 = 256个可能的值.
对于有符号数,最高有效位(第一个从左到右读取值)是符号位; 这留下了2 ^(n-1)个可能值的可能性.对于8位有符号数,对于每个符号,这是2 ^ 7 = 128个可能的值.但由于正号包括零(0到127 = 128个不同的值,而128 + 128 = 2 ^ 8 = 256),因此对于128个不同的值,负号包括-1到...... -128.地点:
10000000 = -128
...
11111111 = -1
00000000 = 0
...
01111111 = 127
Run Code Online (Sandbox Code Playgroud)