假设2的补码格式,在-64 (hex)
和128 (hex)
之间存储值所需的处理器中的最小寄存器长度是多少?
我正在考虑一个8位寄存器,因为8位寄存器的2位补码从0到255。
我说错了吗?
答案 0 :(得分:0)
在二进制补码中,一个8位寄存器的范围为-128到+127。要获得上限,可以用1来填充低7位:01111111是十进制的127。要获得下限,可以将最高位设置为1,将其余位设置为0:10000000是二进制补码中的-128。
那些十六进制值似乎有点奇怪(它们在十进制中是2的幂),但在任何情况下:0x128(0x是十六进制数的标准前缀)是较大的数字的大小,其二进制表示为100101000.您需要能够在符号位之后表示这九位。所以为了能够使用两个补码,你需要至少十位。
答案 1 :(得分:0)
即使只有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位。
答案 2 :(得分:0)
可能你使用了错误的术语。 0x64和0x128很少用作十六进制值。如果你的意思是那些值那么显然你不能用8位存储那么大的范围。 0x128 - (-0x64)= 0x18C,至少需要9位才能存储
OTOH 64和128是非常常见的值,因为它们是2的幂。使用常见的2的补码编码也会花费你9位(因为128超出了8位的2的补码范围)并浪费了大量的未使用的值。但实际上几乎没有9位系统,所以你必须使用16位短路。因此,如果您想节省内存,唯一的方法是使用您自己的编码。
如果您希望值仅用于存储,几乎所有编码都是合适的。例如,正常情况下使用int8_t
-64到127,特殊情况下使用128(-128,-65 ......您喜欢的任何数字),或{0}到0的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比预期多一点)