-1

假设 2 的补码格式,处理器中存储-64 (hex)和之间的值所需的最小寄存器长度是多少?128 (hex)

我在考虑一个 8 位寄存器,因为 8 位寄存器的 2 的补码从 0 变为 255。

我对么?

4

3 回答 3

1

可能您使用了错误的术语。0x64 和 0x128 很少用作十六进制值。如果你的意思是这些值,那么显然你不能用 8 位存储那么大的范围。0x128 - (-0x64) = 0x18C 需要至少 9 位来存储

OTOH 64 和 128 是非常常见的值,因为它们是 2 的幂。使用常见的 2 的补码编码也会花费您 9 位(因为 128 超出了 8 位的二进制补码范围)并浪费了大量未使用的值。但实际上几乎没有 9 位系统,所以您必须使用 16 位短裤。因此,如果您想节省内存,唯一的方法是使用您自己的编码

如果您只需要 storage的值,几乎任何编码都是合适的。例如,int8_t正常使用 -64 到 127 和 128 的特殊情况(-128、-65...任何您喜欢的数字),或uint8_t从 0 到 192 并线性映射值。只需在加载/存储时转换为正确的值。操作仍然需要在大于 8 位的类型中进行,但磁盘大小只有 8 位

如果您需要计算值,则应更加小心。例如,您可以使用超 64编码,其中二进制 0 表示 -64,192 表示 128,或者通常aa - 64. 每次计算后,您都必须重新调整正确表示的值。例如,如果 A 和 B 分别存储为ab分别是A - 64B - 64然后A + B将被完成a + b + 64(因为我们比预期多减去了 64 )

于 2013-08-08T07:35:38.540 回答
1

即使它是 128(十进制)最大值,你也不会是正确的。由于您使用 2 的补码,因此范围实际上是从 −(2 N−1 ) 到 +(2 N−1 − 1) ,其中 N 是位数。所以 8 位的范围是 -128 到 127(十进制)。

由于您实际上将其显示为 -64(十六进制)到 128(十六进制),因此您实际上是在查看 -100(十进制)到 296(十进制)。添加一个位可以将范围增加到 -256 到 255,最后一个添加可以使您增加到 -512 到 511。将所需的数量设为10 位

现在确保您处理的不是 -64 到 128(十进制)。正如我之前指出的那样,8 位范围仅达到 127,如果您不小心,这将成为一个非常棘手的问题。那么它将是9 位

于 2012-10-01T18:40:32.733 回答
0

在二进制补码中,一个 8 位寄存器的范围为 -128 到 +127。要获得上限,请用 1 填充低 7 位:01111111 是十进制的 127。要获得下限,请将最高位设置为 1,将其余位设置为 0:10000000 在二进制补码中是 -128。

这些十六进制值似乎有点奇怪(它们是十进制的 2 的幂),但无论如何:0x128(0x 是十六进制数字的标准前缀)是数量级中较大的数字,其二进制表示为 100101000 . 你需要能够表示符号位之后的那九位。因此,为了能够使用二进制补码,您至少需要十位。

于 2012-10-01T18:37:57.577 回答