我刚刚在this answer - Loading and storing bytes in MIPS中阅读了@Cheshar的评论。
这是我关于他的第一点的理由:$t0
中的值应为0xFFFFFF90
(即,用符号扩展),但这不会改变{{1} }(我认为这是指从mem(4)
开始的单词),现在仍然是0x04
。我说得对吗?
但是我不确定他的第二点:
[“]
FFFF90FF
和lb
不在乎字节序。[。”]
我在想为什么 从大端到小端的变化是
sb
所以似乎单个字节仍像大字节序一样被读取?
答案 0 :(得分:2)
lb/sb
不在乎对疾病的抵抗力。 单个字节没有无字节序。
仅当存储大/小尾数[(例如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
。
更新:
我赞成您的回答,因为它很干净。但是您以前不认为这是反直观的吗?因为在小尾数法中,从左向右或从右向左一起读取32位整数时,32位整数没有意义...?
一旦数据位于寄存器中(通过lw
),我们就会以大字节序(即左移1乘以2)的方式可视化并对其进行操作。
十进制值123
是“ big endian”(一百+二十+三)。
当我们从内存中获取或存储到内存时,小尾数仅是字节顺序。硬件将根据需要重新排列字节。
little endian的优点是,它对于较大的多精度数(例如libgmp
)更有效。
而且,当英特尔首次推出8位8080处理器(仅具有单字节内存总线)时,小字节序使事情变得更快。例如,当执行add
时,在获取偏移量为0的LSB之后,它可以与获取偏移量为1的MSB并行添加两个LSB字节。
举个例子:8位(无符号)整数b00100001是33(十进制),但是具有小的字节序,它存储为b00010010,当从从左到右读取时,它是18(十进制)。 >,以及b01001000,即从从右向左逐位读取时为64 + 8 = 72(十进制)。
虽然[em] 可能使[理论]计算机体系结构像您描述的那样运行,但[我所知道的]现代计算机体系结构却没有。部分原因是要做到这一点需要更复杂的电路。
但是,我曾经编写了一个多精度数学程序包,其中 did 使用小字节序字节 字节内的小字节序位。但是,它慢。有时对于大位向量(例如500,000位宽)很有用
或者我的想法是完全错误的,因为计算机只能将字节视为基础位的抽象。
字节中 bits 的字节序相同(大字节序),而不管字节是在寄存器中还是在存储单元中。
不同的字节序仅适用于多字节整数(例如,在C,int
或short
中)。