解题-写一个程序判断当前机器的大小端存储模式 #两种方法
文章目录
前言
一、思考
二、解题
方法一:
方法二:
总结
前言
路漫漫其修远,吾将上下而求索。
想要更加详细地了解大小端字节序的相关知识可以戳此链接:http://t.csdnimg.cn/oZXDP
一、思考
”大小端字节序“中的”大小端“可以理解为数据在内存中排列顺序的问题,而”字节序“则是由于内存单元的大小为 1byte,当数据大于 1byte 的时候,就存在每一个大小为1字节数据之间顺序问题(以字节为单位讨论数据在内存中的存储顺序);
- 大端字节序:将高位字节序的数据放到低地址处,低位字节序的数据放在高地址处;
- 小端字节序:将低位字节序的数据放在低地址处,高位字节序的数据放在高地址处;
以在内存中存储 int i = 0x11223344; 为例来具体分析:
数据在内存中的存储的顺序关系是在以字节大小的空间之间的顺序问题,即内存单元中存放数据顺序的问题;
显然,聪明的你可能会想到使用int i = 0x00000001 ;然后看变量 i 其第一个字节空间的大小;为1 则说明为小端字节序; 为0 则说明为大端字节序;
二、解题
方法一:
如上思考分析
代码如下:
#include<stdio.h>int CheakSys()
{int i = 1;return *((char*)&i);
}
int main()
{//方法一int ret = CheakSys();if (ret == 0)printf("当前机器采用的是大端字节序\n");elseprintf("当前机器采用的是小端字节序\n");return 0;
}
在VS编译器下执行结果如下:
方法二:
思路和方法一如出一辙,但是解决方法的形式不同;
看了方法一,其核心就是:
整型变量会向内存申请 4 byte 的空间来存放数据,此时给这个变量一个值 :1 ; 然后取其第一个字节空间的数据看是0还是1;
是0则为大端字节序,因为大端字节序存储模式会将低位字节序的数据放在高地址处;
而若是1,则就为小端字节序,因为小端字节序的存储模式会将低位字节序的数据放在低地址处;
大体给人的轮廓的感觉就是,用4 byte 大小的空间存放 0x00 00 00 01 , 结果就取出它处于较低地址处一个字节空间的数据,聪明的你可能会联想到使用联合!
联合,又称为共用体,即其成员共同使用空间;
代码如下:
//方法二:利用联合#include<stdio.h>int CheakSys()
{union Un{int i;char c;}u;u.i = 1;return u.c;
}int main()
{int ret = CheakSys();if (ret == 0)printf("当前机器采用的是大端字节序\n");elseprintf("当前机器采用的是小端字节序\n");return 0;
}
在VS编译器下执行结果如下:
总结
核心:整型变量会向内存申请 4 byte 的空间来存放数据,此时给这个变量一个值 :1 ; 然后取其第一个字节空间的数据看是0还是1;