大小端存储问题

来源:互联网 发布:阿里云个人免费套餐 编辑:程序博客网 时间:2024/05/18 10:27

在生活中我们会遇到很多大小端的问题,别看这是小小的问题有时候却能把我们摔一个跟头。
大端存储:高位存在低地址,低位存在高地址,高位先存。
小端存储:高位存在高地址,低位存在低地址,低位先存。

举个栗子说明一下:
内存从0X0000开始有以下的数据
0x0000 0x12
0x0001 0x34
0x0002 0xab
0x0003 0xcd
如果我们读取一个地址为0x0000的的四个字节的变量:
大端读取为:0x1234abcd
小端读取为:0xcdab3412
我们将0x1234abcd写到0x00000开始的内存中结果是:

这里写图片描述
1、用指针区分大小端

void judge_endian(){    int a = 1;              //定义1是为了方便,数字可以任意选    char* p = (char*)&a;   //将整型a的地址转换成char*,方便下面取一个字节内容    if(*p == 1)           //对取得地址进行解引用然后与1进行比较        printf("小端\n");    else        printf("大端\n");}

简单图示: int类型占4个字节,如下图方式存储
这里写图片描述

2、利用联合体解决
联合体的各个成员共用同一内存,应该同时只有一个成员得到这块内存的使用权,而各个结构体成员各自拥有内存,相互之间不干涉。

#include<stdio.h>  #include<stdlib.h>  void Judge_endian(void)  {      union t      {           int i;           char c;      } t1;       t1.i = 1;       if(t1.c == 1)           printf("小端\n");       else           printf("大端\n");  }  int main()  {      Judge_endian();    system("pause");      return 0;  }  
0 0
原创粉丝点击