RISC-V I-Type 的直接字段中的地址可以为负吗?

Can address be negative in the immediate field of the RISC-V I-Type?

我了解到 'subi' 在 RICS_V ISA 中不需要,并且立即字段代表一个二进制补码整数来完成运算。

我的问题是,如果直接部分可以表示为负数,那么我们是否也可以将地址表示为负整数?

Can address be negative in the immediate field of the RISC-V I-Type?

直接字段并没有真正存储地址——它太短了,无法做到这一点。它存储中小整数,并在使用上进行了符号扩展,因此它可以存储正整数和负整数。

I learned that 'subi' isn't needed in RICS_V ISA and the immediate field represents a two's complement integer to do the operation altogether.

是的。立即数字段在使用前确实被符号扩展到 32(或 64)位,因此我们可以添加负立即数而不是减去正立即数。

My question is, if the immediate part can be represented as a negative number then could we also represent addresses as a negative integer?

后一项与前一项不同。

内存系统有一个地址总线,它只是一个有序的位数组。不考虑地址总线上的符号或负值——MSB 被视为更高的幅度而不是符号位。因此,我们认为地址是无符号数。

但是,没有什么可以阻止您将内存地址解释(例如打印)为有符号整数。


2 对有符号数的补码表示意味着在加、乘、减或比较有符号数时会出现与使用无符号数进行相同操作时相同的位模式。由于结果的位模式相同,真正的区别在于确定溢出,因为有符号数和无符号数溢出不同。

我们应该对地址使用无符号算术,因为无符号具有适当的溢出标准:全 1 的值是一个大的正数,如果递增,则会溢出并变为 0。

相比之下,如果我们对地址使用有符号算术,即使我们应该溢出,也不会在从全 1 到 0 时溢出。此外,如果我们将 1 添加到 01111...111 产生 10000...000,我们 在不应该发生的情况下发生溢出。


请注意,在许多情况下,我们不会费心检查溢出,尤其是地址和指针运算。如果程序是正确的,那么在计算我们已知存在的某个内存的地址时,计算就不会溢出。因此,验证您的内存分配是否成功很重要。