编译器和字节序
compiler and endians
我有一个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
然后由软件来交换字节顺序
相关文章:
- 从不同线程使用int64的不同字节安全吗
- C/C++编译器通常会删除重复的库吗
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- Win32编译器选项和内存分配
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 在UNIX系统中使用DIR查找文件的字节大小
- C++,我收到一个无法理解的编译器错误
- 在线编译器中的分段C++没有打印消息
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- Sizeof 舍入到对齐方式,但编译器仍将对象放在剩余的字节中
- GCC 编译器一个字节中有多少位
- 如何告诉GCC通过编译器设置(不是编译指示)将结构大小边界设置为4字节?
- 填充字节发现以及数组初始值设定项中多余元素的常见和特殊编译器行为
- c++编译器如何将转义序列转换为实际字节
- 在64位机器上使用8字节作为int数据类型大小的任何C/ c++编译器
- 不同编译器中枚举的字节大小
- 决定字节大小的是编译器还是CPU
- 编译器和字节序