首页 未命名正文

linux编程_C语言之巨细端问题

云返利网 未命名 2020-05-26 09:06:31 17 0

1:巨细端名字的由来及生长
  (1)在乔纳森·斯威夫特的著名取笑小说《格列夫游记》中,小人海内部门裂成Big-endian和Little-endian两派,区别在于一派要求从鸡蛋的大头把鸡蛋打破,另一派要求从鸡蛋的小头把鸡蛋打破。斯威夫特借以取笑英国的政党之争,在计算机工业中指数据储存顺序的分歧。
    (2)厥后计算机通讯生长起来后,遇到一个问题就是:在串口等串行通讯中,一次只能发送1个字节。这时刻我要发送一个int类型的数就遇到一个问题。int类型有4个字节,我是凭据:byte0 byte1 byte2 byte3这样的顺序发送,照样凭据byte3 byte2 byte1 byte0这样的顺序发送。规则就是发送方和接收方必须凭据同样的字节顺序来通讯,否则就会泛起错误。这就叫通讯系统中的巨细端模式。这是巨细端这个词和计算机挂钩的最早问题。
  (3)现在我们讲的这个巨细端模式,更多是指计算机存储系统的巨细端。在计算机内存/硬盘/Nnad中。由于存储系统是32位的,然则数据仍然是凭据字节为单元的。于是乎一个32位的二进制在内存中存储时有2种漫衍方式:高字节对应高地址(大端模式)、高字节对应低地址(小端模式)
  (4)现实的情形就是:有些CPU公司用大端(譬如C51单片机);有些CPU用小端(譬如ARM)。(大部门是用小端模式,大端模式的不算多)。于是乎我们写代码时,当不知道当前环境是用大端模式照样小端模式时就需要用代码来检测当前系统的巨细端。
2:测试机械巨细端模式的测试代码
2.1:使用union来测试机械的巨细端
#include<stdio.h>
union myunion
{
    int a;
    char b;
};
 
int little_or_big(void)
{
    myunion u1;
    u1.a = 1;
    return u1.b;
}
int main(void)
{
    int i = little_or_big();
    if(1==i)
    {
        printf("小端模式");
    }
    else
    {
        printf("大端模式");
    }
    return 0;
}


剖析:
  首先共用体元素a和b在接见时刻都是从低地址最先接见的,u1.a = 1在内存中的存放有两种可能(内存地址从左到右递减),小端模式为 00  00 00 01;大端模式为: 01 00 00 00 ,而共用体u1中的b是char类似,以是我们用u1.b去接见时只能读取到最低地址的值(按char去剖析时只会读取一个字节),以是,若是读出u1.b的值为1则说明当前机械是小端模式,读出u1.b的值为0,则说明当前机械是大端模式(这种测试方式要记着,面试时刻经常考)
2.2:指针方式来测试巨细端
123456 int little_or_big2(void)
{
    int a = 1;
    char  b = *((char *) &a);
    return b;
}


剖析:
  首选界说变量a= 1,然后将a的指针强制类型转换成char *接着去解应用这个指针,并赋值给b,然后凭据b的返回值来确定巨细端。实在剖析可以发现其本质都是一样的,都是先给一个内存内里存一个char 类型的1,然后使得另一个char 类型的变量b去读取这个内存的值,然后凭据读取的值来判断巨细端。
3:看似可行但现实不行的巨细端测试方式
注:测试方式将测试代码划分放在kile4.0(大端)和gcc(小端)下面去运行,看运行后的效果。

【关于云返利网】

云返利网是阿里云、腾讯云、华为云产品推广返利平台,在各个品牌云产品官网优惠活动之外,云返利网还提供返利。您可以无门槛获得阿里云、华为云、腾讯云所有产品返利,在官网下单后就可以领取,无论是自己用、公司用还是帮客户采购,您个人都可以获得返利。云返利网的目标是让返利更多、更快、更简单!详情咨询13121395187(微信同号)