发送一个int类型的数据是如何发送的,在发送与接收自序相同的情况下,是按照bit0~bit3发送还是bit3~bit0的顺序发送。
这就涉及到了数据存储的大端模式与小端模式。用一个32位数据进行举例:原数据为0x12345678。
可见小端模式与大端模式的区别在于数据的存储数据是由高到低存还是由低到高存。
大端模式:高位放低地址。
小端模式:高位放高地址。
那么在不知道处理器是大端模式还是小端模式的情况下,应该如何对处理器进行判断,可以使用如下代码查看返回值进行判断。
union myunion
{
int a;
char b;
}
int is_little_endian(void)
{
union myunion u1;
u1.a=1;
return u1.b;
}
这里我们运用到了共用体的变量共用同一块内存的性质,如果返回值为1则处理器为小端模式,如果返回值为0则为大端模式。
int定义了4个字节是数据,但是char只会访问其中的最低一位字节。根据这个规则使用指针也能实现相同的目的。
char is_little_endian2(void)
{
int a=1;
char b=*((char*)(&a));
return b;
}
那么使用位&可以吗,答案是不行,因为位&操作是由编译器进行计算的,高位数据无论如何都是高位数据,会自动进行对齐。同理使用位移操作也是不行的,因为这些运算符级别高于二进制位移位与的永远是从原始数据的低位开始。