C++ 编译器和endian

C++ 编译器和endian,c++,compiler-construction,endianness,C++,Compiler Construction,Endianness,我有一个ISA,有点像小endian。 基本内存单元是整数而不是字节 00000000: BEFC03FF 00008000 表示“低”整数为BEFC03FF,“高”整数为00008000。 我需要读取一些位表示的值。例如,位31到47。 我在VS10(c++)中所做的是生成uint64\u t var=0x000080000befc03ff 使用相关掩码后,检查var&mask的值。 这样做合法吗?我对uint64位的安排做了一些假设-合法吗? 我可以假设,对于每个编译器和每个操作系统(不依

我有一个ISA,有点像小endian。 基本内存单元是整数而不是字节

00000000: BEFC03FF 00008000
表示“低”整数为
BEFC03FF
,“高”整数为
00008000
。 我需要读取一些位表示的值。例如,位31到47。 我在VS10(c++)中所做的是生成uint64\u t var=0x000080000befc03ff 使用相关掩码后,检查
var&mask
的值。 这样做合法吗?我对uint64位的安排做了一些假设-合法吗?
我可以假设,对于每个编译器和每个操作系统(不依赖硬件),uint64中的位的排列方式都是这样吗?

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

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

0000  FF
0001  03
0002  ..
假设,如果外部总线协议是big-endian,而处理器是little-endian。然后,处理器中的一个16位整数,比如0x1234将是本机格式的
0001\u 0010\u 0011\u 0100
,但总线上的
0010\u 1100\u 0100\u 1000
(假设为16位)

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

0000 0001_0010
0001 0011_0100

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

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

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

0000  FF
0001  03
0002  ..
假设,如果外部总线协议是big-endian,而处理器是little-endian。然后,处理器中的一个16位整数,比如0x1234将是本机格式的
0001\u 0010\u 0011\u 0100
,但总线上的
0010\u 1100\u 0100\u 1000
(假设为16位)

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

0000 0001_0010
0001 0011_0100

然后由软件交换字节顺序

您实际需要做什么?是否需要读/写特定的内存地址,或执行其他形式的I/O?如果不是,那么你就不需要担心endianness。@OliCharlesworth-我没有写我想做的吗?如果不是I/O-为什么我不需要担心endianness?我想理解这个概念,如果它依赖于编译器,那么像
uint64_t var=0x000080000befc03ff;变量和掩码
不依赖于endianness。Endianness只在您关心底层表示时才重要(这就是为什么它对IO很重要的原因)@OliCharlesworth-但我给出的是uint64_t var=0x000080000BEFC03FF,而不是uint64_t var=0xBEFC03FF00008000。因此,我假设了uint64_t表示的一些内容。我可以做什么样的假设?如果我切换到其他编译器,会发生什么?没关系。C++语言关注的是值,而不是底层的硬件映射。你真正需要做什么?是否需要读/写特定的内存地址,或执行其他形式的I/O?如果不是,那么你就不需要担心endianness。@OliCharlesworth-我没有写我想做的吗?如果不是I/O-为什么我不需要担心endianness?我想理解这个概念,如果它依赖于编译器,那么像
uint64_t var=0x000080000befc03ff;变量和掩码
不依赖于endianness。Endianness只在您关心底层表示时才重要(这就是为什么它对IO很重要的原因)@OliCharlesworth-但我给出的是uint64_t var=0x000080000BEFC03FF,而不是uint64_t var=0xBEFC03FF00008000。因此,我假设了uint64_t表示的一些内容。我可以做什么样的假设?如果我切换到其他编译器,会发生什么?没关系。C++语言关注的是值,而不是底层映射到硬件。
0000  FF
0001  03
0002  ..