假设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被存储为a
和b
,它们分别是A - 64
和B - 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个比特。