【C语言】 检测大小端存储

#include <stdio.h>

int sys_check()
{
    int i = 1;
    char *pi = (char *)&i;  //强制类型转换为char *,取首字节的内容,用以判断条件
    //if (1 == *(char *)&i)
    if (*pi == 1)
    {
	return 1;
    }
    else
    {
	return 0;
    }
}
int main()
{
    int ret = sys_check();
    if (ret == 1)
    {
	printf("little\n");  //小端存储
    }
    else
    {
	printf("big\n");  //大端存储
    }
    return 0;
}

此外,可以使用联合体(共用体) union:
封装另一个共同功能的函数:
(main函数缺省)

int sys_check()
{
union UN
    {
	int i;
	char c;
    }un;
    un.i = 1;
    if (un.c == 1)
    {
	return 1;//返回1表示小端
    }
    else
    {
	return 0;//返回0表示大端
    }

}

上面是以 1 为例判断,以下是详细对大小端存储的解释:

一、大端模式:低位字节排放在内存的高地址端,高位字节在内存的低地址端

二、小端模式:低位字节排放在内存的低地址端,高位字节在内存的高地址端

三、一个整型数字,0x12345678在内存里的存储方式,

a 大端模式

  0x12  0x 34 0x56  0x78
  低地址           → 高地址

  b小端模式

    0x78  0x 56 0x34  0x12
  低地址           → 高地址
 
*** 大端模式的内存存储与字符串存储类似,小端模式则相反

四、若起始地址为0x8000,则0x12345678的存储情况为
内存地址
大端存储小端存储
0x80000x120x78
0x80010x340x56
0x80020x560x34
0x80030x780x12
五、程序判断自己电脑的存储方式

1,使用共用体

    union {
          int a;
          char b;
     }num;
   num.a=0x12345678;
   cout<<hex<<int(num.b)<<endl;  //  在int大小的四个字节中取出第一个判断
  在我的电脑上输出78 可知本机上的存储方式为小端存储
  
2,使用地址转换

int a=0x12345678;
char b=*(char *)&a;
if(b==0x12)
  是大端存储
Else
  是小端存储
  
六、一般操作系统都是小端存储,在通讯协议中一般是大端存储方式


本文出自 “Vs吕小布” 博客,谢绝转载!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值