个人理解—大端模式与小端模式

        发送一个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;
}

        那么使用位&可以吗,答案是不行,因为位&操作是由编译器进行计算的,高位数据无论如何都是高位数据,会自动进行对齐。同理使用位移操作也是不行的,因为这些运算符级别高于二进制位移位与的永远是从原始数据的低位开始。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值