1

我有一个“有点”小端序的 ISA。基本内存单位是整数而不是字节。例如

00000000: BEFC03FF 00008000

表示“低”整数是BEFC03FF ,“高”整数是00008000。我需要读取一些位表示的值。例如位 31 到 47。我在 VS10 (c++) 中所做的工作在使用相关掩码并检查var & mask. 这样做合法吗?我对 uint64_t 位的排列做了一些假设——合法吗?我可以假设对于非常编译器和每个操作系统(不依赖于硬件),uint64_t 中的位排列都是这样的吗?

4

1 回答 1

1

你的担心是对的,这很重要

但是,在这种特殊情况下,由于 ISA 是小端,即如果它具有 AD[31:0],则整数的最低有效位被打包到位 0。假设您的处理器也是小端,那么无需担心. 当数据写入内存时,它应该有正确的字节顺序

0000  FF
0001  03
0002  ..

假设,如果您的外部总线协议是大端并且您的处理器是小端。那么你的处理器中的一个 16 位整数,比如 0x1234 将是0001_0010_0011_0100本机格式,但0010_1100_0100_1000在总线上(假设它是 16 位)。

在这种情况下,多字节数据跨越字节序边界,硬件只会交换字节内的位,因为它必须保持字节之间的内存连续性。硬件交换后,变为:

0000 0001_0010
0001 0011_0100

然后由软件来交换字节顺序

于 2013-02-01T15:09:29.157 回答