抱歉,我没有完全理解您的设置。我会回答一点“周围”。
如果你的“位布局”很简单:
9 8 7 6 5 1 0
sign rawvalue rawvalue rawvalue rawvalue ... rawvalue rawvalue
那么用 1+8 位你可以有值:
-255 -254 ... -2 -1 -0 +0 +1 +2 ... +254 +255
因为边缘情况是:
111111111 ... 100000000 000000000 ... 011111111
(-255) (-0) (+0) (+255)
请注意,在这种纯编码中,没有这样的东西 +256。它是+0。当然,您可以使用一些智能代码来解决它,但在基本思想中,它实际上是 +0,因为最左边的 1 感觉到“符号”位并且原始值为 0。
请注意,数学上 -0 == +0 但它们有不同的符号。这是一个值的浪费,也使数学运算复杂化。这是引入 双补码 系统的其他原因之一,它允许您使用范围为
的值
-256 ... -2 -1 0 +1 +2 ... +255
100000000 ... 111111110 111111111 000000000 000000001 000000010 ... 011111111
在二进制补码系统中,第一位也称为“符号位”,但对负数进行了明智的编码,而不仅仅是“符号=1”后跟“原始值”。在这里,负值被“反转”。这种编码允许非常简单的数学运算,因为即:
0 - 1 ==> 0 ===> 000000000 - 000000001 ==> 111111111 +underflow,ignored
-1 + 1 ==> 0 ===> 111111111 + 000000001 ==> 000000000 +overflow,ignored
因此,根据您选择的编码,您永远不会有 +256,但您可能有 -256 可用(二进制补码)或没有(普通符号)。
(顺便说一句,把plain和twoscomplement放在一边:当然,您可以采用任何其他编码或以您想要的任何方式对数字进行编码,即范围为-11..500或类似的东西,但可能那里不会有任何明显的“标志”位)