存储-64(十六进制)到128(十六进制(hex))之间的值所需的最小寄存器长度



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

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

我说得对吗?

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

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

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

如果需要值进行计算,则应更加小心。例如,您可以使用excess-64编码,其中二进制0表示-64,192表示128,或者通常a将由a - 64表示。每次计算后,您必须重新调整值以获得正确的表示。例如,如果A和B被存储为ab,它们分别是A - 64B - 64,那么A + B将被作为a + b + 64(正如我们已经减去64比预期多一个)

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

由于您实际将其表示为-64(十六进制)到128(十六进制(Hex)),因此您实际看到的是-100(十进制)到296(十进制)。加一个比特,你会把范围增加到-256到255,最后一个加法会让你达到-512到511。将所需的数量设为10位

现在请确保您没有处理-64到128(十进制)。正如我之前指出的,8位的范围只有127,如果你不警觉的话,这将是一个非常棘手的问题。那么它将是9位

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

这些十六进制值看起来有点奇怪(它们是十进制中的二次方),但在任何情况下:0x128(0x是十六进制数字的标准前缀)是数值中较大的一个,其二进制表示为100101000。您需要能够在符号位之后表示这九个位。因此,要想使用2的补码,至少需要10个比特。

相关内容

  • 没有找到相关文章

最新更新