如果我在8位处理器 (比如8051) 的内存里有一个int32类型的整数,我该如何确定这个整数的字节序(endianess)?这是与编译器有关的吗?当通过串行线传输多字节数据时,了解它的字节序十分重要。
如果我在8位处理器 (比如8051) 的内存里有一个int32类型的整数,我该如何确定这个整数的字节序(endianess)?这是与编译器有关的吗?当通过串行线传输多字节数据时,了解它的字节序十分重要。
当使用一个没有本地支持更宽整数的8位微控制器时,存储在内存中的整数的字节序确实取决于编译器的编写者。
SDCC编译器广泛应用于8051,以小端格式存储整数(该编译器的用户指南声称,在该体系结构上更有效率,因为存在增加数据指针但不存在减少数据指针的指令)。
如果处理器有对多字节值进行操作或拥有多字节寄存器,则可能具有端序性。
http://69.41.174.64/forum/printable.phtml?id=14233&thread=14207 暗示8051在不同位置混合使用不同的端序性。
编译器并不是唯一的决定因素 - '51芯片有一些本地的16位寄存器(DPTR,标准中的PC,变体中的ADC_IN,DAC_OUT等)具有特定的字节序,编译器必须遵守 - 但除此之外,编译器可以自由选择任何喜欢的字节序或者你在项目配置中选择的字节序...
unsigned long int x = 1;
unsigned char *px = (unsigned char *) &x;
*px == 0 ? "big endian" : "little endian"
#include <stdio.h>
union foo {
int as_int;
char as_bytes[sizeof(int)];
};
int main() {
union foo data;
int i;
for (i = 0; i < sizeof(int); ++i) {
data.as_bytes[i] = 1 + i;
}
printf ("%0x\n", data.as_int);
return 0;
}
如何解释输出结果由您决定。