关于MIPS lb和sb以及endianness
我刚刚读到了@Cheshar的评论关于MIPS lb和sb以及endianness,mips,endianness,Mips,Endianness,我刚刚读到了@Cheshar的评论 这是我关于他的第一点的推理:$t0中的值应该是0xFFFFFF90(即它的符号扩展),但这不会改变mem(4)的结果(我认为这意味着读取从0x04开始的单词),它仍然是FFFF90FF。我说得对吗 但我不确定他的第二点: [“]lb和sb不在乎结尾。[.] 我在想为什么 从大端到小端的变化是 byte: 0 1 2 3 ----\ 3 2 1 0 00 90 12 A0 ----/ 00 90 1
$t0
中的值应该是0xFFFFFF90
(即它的符号扩展),但这不会改变mem(4)
的结果(我认为这意味着读取从0x04
开始的单词),它仍然是FFFF90FF
。我说得对吗
但我不确定他的第二点:
[“]lb
和sb
不在乎结尾。[.]
byte: 0 1 2 3 ----\ 3 2 1 0
00 90 12 A0 ----/ 00 90 12 A0
所以看起来单个字节的读取方式仍然像big-endianlb/sb
不在乎是否持久。一个字节没有尾数
只有当您存储一个大/小的endian[(例如)4字节]数字,然后尝试逐字节访问它时,这才重要
字节偏移量不会改变,因此更好的图表可能是:
byte: 0 1 2 3 ----\ 0 1 2 3
00 90 12 A0 ----/ A0 12 90 00
如果$t1
指向存储的整数,则执行以下操作时:
lb $t0,1($t1)
对于小尾端,您将获得90
,对于大尾端,您将获得12
更新:
我赞成你的答案,因为它是干净的。但你以前不认为这是违反直觉的吗?因为在little endian中,当从左到右或从右到左一起读取32位时,32位整数没有意义 一旦数据进入寄存器(通过
lw
),我们将其视为big-endian并对其进行操作(即,左移1等于乘以2)
十进制值123
为“大端”(一百+二十+三)
Little endian只是我们从内存中获取或存储到内存中时的字节顺序。硬件将根据需要洗牌字节
little-endian的优点是,它更适用于大的多精度数字(例如,libgmp
)
而且,当英特尔首次推出8位8080处理器(只有一个单字节内存总线)时,little endian使速度更快。例如,在执行添加操作时,在获取偏移量0处的LSB后,可以在获取偏移量1处的MSB的同时添加两个LSB字节
举一个例子:8位(无符号)整数b00100001是33(十进制),但有小尾数,它被逐位存储为b00010010,从从左到右读取时是18(十进制),从从右到左读取时是64+8=72(十进制)
虽然一个[理论上的]计算机体系结构有可能像你所描述的那样运行,但据我所知,没有一个现代体系结构能做到这一点。这部分是因为这样做需要更复杂的电路
然而,我曾经写过一个多精度数学包,它确实使用了小端字节和字节中的小端字节。但是,它很慢。这有时适用于大位向量(例如500000位宽)
或者我的想法是完全错误的,因为计算机只能将字节视为底层位的抽象
一个字节中的位的尾数是相同的(big-endian),不管该字节是在寄存器中还是在内存单元中
不同的尾数仅适用于多字节整数(例如,在C中,int
或short
)。lb/sb
不关心尾数。一个字节没有尾数
只有当您存储一个大/小的endian[(例如)4字节]数字,然后尝试逐字节访问它时,这才重要
字节偏移量不会改变,因此更好的图表可能是:
byte: 0 1 2 3 ----\ 0 1 2 3
00 90 12 A0 ----/ A0 12 90 00
如果$t1
指向存储的整数,则执行以下操作时:
lb $t0,1($t1)
对于小尾端,您将获得90
,对于大尾端,您将获得12
更新:
我赞成你的答案,因为它是干净的。但你以前不认为这是违反直觉的吗?因为在little endian中,当从左到右或从右到左一起读取32位时,32位整数没有意义 一旦数据进入寄存器(通过
lw
),我们将其视为big-endian并对其进行操作(即,左移1等于乘以2)
十进制值123
为“大端”(一百+二十+三)
Little endian只是我们从内存中获取或存储到内存中时的字节顺序。硬件将根据需要洗牌字节
little-endian的优点是,它更适用于大的多精度数字(例如,libgmp
)
而且,当英特尔首次推出8位8080处理器(只有一个单字节内存总线)时,little endian使速度更快。例如,在执行添加操作时,在获取偏移量0处的LSB后,可以在获取偏移量1处的MSB的同时添加两个LSB字节
举一个例子:8位(无符号)整数b00100001是33(十进制),但有小尾数,它被逐位存储为b00010010,从从左到右读取时是18(十进制),从从右到左读取时是64+8=72(十进制)
虽然一个[理论上的]计算机体系结构有可能像你所描述的那样运行,但据我所知,没有一个现代体系结构能做到这一点。这部分是因为这样做需要更复杂的电路
然而,我曾经写过一个多精度数学包,它确实使用了小端字节和字节中的小端字节。但是,它很慢。这有时适用于大位向量(例如500000位宽)
或者我的想法是完全错误的,因为计算机只能将字节视为底层位的抽象
一个字节中的位的尾数是相同的(big-endian),不管该字节是在寄存器中还是在内存单元中
不同的endianess仅适用于多字节整数(例如,在C中,
int
或short
)。我希望当我从地址0x101加载一个字节时,我会得到地址处的字节