编译器和字节序

compiler and endians

本文关键字:字节 编译器      更新时间:2023-10-16

我有一个ISA,它是小端序的"有点"。基本内存单元是整数而不是字节。例如

00000000: BEFC03FF 00008000

表示"低"整数为BEFC03FF,"高"整数为00008000。我需要读取一些位表示的值。例如位 31 到 47。我在VS10(c ++)中所做的生成uint64_t var = 0x00008000BEFC03FF使用相关掩码并检查var & mask的值后。这样做合法吗?我对uint64_t位安排做了一些假设 - 合法吗?我可以假设对于非常编译器和每个操作系统(不依赖于 hw)uint64_t中的位排列会是这样的吗?

你担心是对的,这确实很重要。

但是,在这种特殊情况下,由于 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

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