签名字符范围

Par*_*ita 17 c

为什么符号字符的范围是-128127,但不-127128

Chr*_*ung 28

这是因为二进制补码编码的工作方式:0被视为"正"数(有符号位关),因此,可用正值的数量减少了一个.

一些补码编码中(现在不是很常见,但在过去,它是),+ 0和-0有单独的值,因此8位数量的范围是-127到+127 .


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视为无效位组合(陷阱表示).


Yan*_*hon 7

我认为一个简单的方法来解释这个共同的灵魂是:

的位是一个值01,或2点的可能性

A 2位保持两个组合或01用于四个可能的值:00,01,10,和11.

3位保存三种组合,总共有八种可能的值:000to 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)