8位处理器是否必须面对字节序问题?

时间:2010-03-19 12:54:15

标签: c 8051

如果我在8位处理器的内存中有一个int32类型的整数,比如8051,我如何识别该整数的字节顺序?它是编译器特定的吗?我认为通过串行线路等发送多字节数据时这很重要。

7 个答案:

答案 0 :(得分:7)

对于没有本机支持更宽整数的8位微控制器,存储在内存中的整数的字节顺序确实取决于编译器编写器。

在8051上广泛使用的SDCC编译器以小端格式存储整数(该编译器的用户指南声称它在该体系结构上更有效,因为存在递增数据指针的指令但不是一个减少的。)

答案 1 :(得分:5)

如果处理器有任何作用于多字节值的操作,或者具有多字节寄存器,则可以使用字节序。

http://69.41.174.64/forum/printable.phtml?id=14233&thread=14207表明8051在不同的地方混合了不同的字节序。

答案 2 :(得分:3)

字节序特定于CPU架构。由于编译器需要针对特定​​的CPU,编译器也会知道字节序。因此,如果您需要通过串行连接,网络等发送数据,您可能希望使用内置函数将数据按网络字节顺序排列 - 特别是如果您的代码需要支持多种体系结构。

有关详细信息,请参阅:http://www.gnu.org/s/libc/manual/html_node/Byte-Order.html

答案 3 :(得分:3)

这不仅仅取决于编译器 - '51具有一些编译器必须遵守的给定字节序的本机16位寄存器(DPTR,标准中的PC,ADC_IN,DAC_OUT等变体) - 但除此之外,编译器可以自由使用它喜欢的任何字节顺序或者你在项目配置中选择的字节顺序......

答案 4 :(得分:2)

整数没有字节顺序。你无法通过查看字节确定它是大端还是小端。您只需要知道:例如,如果您的8位处理器是小端,并且您收到一条消息,您知道它是大端(例如,因为现场总线系统定义了大端),您必须转换值超过8位。您需要对系统进行硬编码或在系统上定义要交换的字节。

请注意,交换字节很容易。您可能还必须在位字段中交换位,因为位字段中的位顺序是特定于编译器的。同样,你基本上必须在构建时知道这一点。

答案 5 :(得分:1)

unsigned long int x = 1;
unsigned char *px = (unsigned char *) &x;

*px == 0 ? "big endian" : "little endian"

如果为x赋值1,则值1将在最低有效字节中。 如果我们然后将x转换为指向字节的指针,则指针将指向x的最低内存位置。如果该内存位置为0则为big endian,否则为little endian。

答案 6 :(得分:0)

#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;
}

解释输出取决于你。