假设2的补码格式,在-64 (hex)
和128 (hex)
之间存储值所需的处理器中的最小寄存器长度是多少?
我正在考虑一个8位寄存器,因为8位寄存器的2位补码从0到255。
我对么?
在二进制补码中,一个8位寄存器的范围为-128到+127。要获得上限,可以用1来填充低7位:01111111是十进制的127。要获得下限,可以将最高位设置为1,将其余位设置为0:10000000是二进制补码中的-128。
那些十六进制值似乎有点奇怪(它们是十进制的2的幂),但在任何情况下:0x128(0x是十六进制数的标准前缀)是数字中较大的数字,其二进制表示为100101000你需要能够在符号位之后表示那九位。所以为了能够使用两个补码,你需要至少十位。
即使它仅为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位。
可能你使用了错误的术语。 0x64和0x128很少用作十六进制值。如果你的意思是那些值那么显然你不能用8位存储那么大的范围。 0x128 - (-0x64)= 0x18C,至少需要9位才能存储
OTOH 64和128是非常常见的值,因为它们是2的幂。使用公共2的补码编码也会花费你9位(因为128超出8位二进制补码范围)并浪费了大量未使用的值。但实际上几乎没有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比预期多了一个)