• 大端和小端


                                                                  大端和小端

        嵌入式开发者应该对大端和小端很熟悉。在内存单元中数据是以字节为存储单位的,对于多字节数据,在小端模式中,低字节数据存放在低地址单元,而在大端模式中,低字节数据存放在高地址单元。比如一个定义一个short型的变量a,赋值为1,由于short型数据占2字节。

    在小端模式中,其存放方式为

    0X4000  00000001

    0X4001  00000000

    而在大端模式中,其存放方式为

    0X4000  00000000

    0X4001  00000001

    若需用程序验证系统是大端模式还是小端模式(一般我们用的x86结构的都是小端模式),有两种方法

    1.利用联合体的性质

        因为联合体中的成员是共享内存的,并且数据是从低地址存放的,可以利用这一性质判断。

    typedef union 
    {
        char a;
        short c;
    }U;
    
    int checkCPU1()  //若是小端则返回1,否则返回0 
    {
        U u;
        u.c=1;
        //printf("%d\n",u.a);
        return u.a==1;
    }

    由于short占2字节,而char占1字节,当对c赋值为1时,若系统为小端模式,则在系统中存放方式为:

    000000001

    000000000

    那么当取a的值时,a的整型值必定为1;否则为0.

    2.强制取低地址单元的数据

    int checkCPU2()
    {
        short a=0x1234;
        char *p=(char *)&a;
        //printf("%d\n",*p);
        return *p==0x34;    
    } 

    很显然,若是小端模式,指针p指向的单元里面的数据整型值必为0x34,否则为0x12。

    测试程序:

    /*测试系统大端模式/小端模式 2011.10.1*/ 
    
    #include <iostream>
    using namespace std;
    
    typedef union 
    {
        char a;
        short c;
    }U;
    
    int checkCPU1()  //若是小端则返回1,否则返回0 
    {
        U u;
        u.c=1;
        //printf("%d\n",u.a);
        return u.a==1;
    }
    
    int checkCPU2()
    {
        short a=0x1234;
        char *p=(char *)&a;
        //printf("%d\n",*p);
        return *p==0x34;    
    } 
    
    int main(int argc, char *argv[])
    {
        printf("%d\n",checkCPU1());
        printf("%d\n",checkCPU2());
        return 0;
    }
  • 相关阅读:
    继承LIst 的类JSON序列化,无法序列化属性的问题
    C#深入学习:泛型修饰符in,out、逆变委托类型和协变委托类型
    12.Java web--过滤器与监听器
    11.Java web—servlet
    10.Java web—JavaBean
    9.Java web—JSP内置对象
    8.Java web—JSP基本语法
    Ubuntu 插入鼠标自动禁用触控板
    Ubuntu安装VLC播放器
    Ubuntu快捷键
  • 原文地址:https://www.cnblogs.com/dolphin0520/p/2197857.html
Copyright © 2020-2023  润新知