我有一个小端的“亲切”的ISA。 基本内存单元是整数而不是字节。例如
00000000: BEFC03FF 00008000
表示“低”整数为BEFC03FF
,“高”整数为00008000
。
我需要读取某些位表示的值。例如,位31到47。
我在VS10(c ++)中做的是生成uint64_t var = 0x00008000BEFC03FF
在使用相关掩码并检查var & mask
的值之后。
这样做是否合法?我对uint64_t位排列做了一些假设 - 这是合法的吗?
我可以假设对于非常编译器和每个操作系统(不依赖于hw),uint64_t中的位排列将是这样的吗?
答案 0 :(得分: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
然后由软件交换字节顺序