关于大小端的简单介绍以及使用C写一个函数判断当前系统是大端存储还是小端存储
来源:互联网 发布:ipad 壳淘宝店铺 编辑:程序博客网 时间:2024/04/29 15:27
大端模式:
字数据的高字节存储在低地址中,而字数据的低字节存储在高地址中。
小端模式:
字数据的低字节存储在低地址中,而字数据的高字节存储在高地址中。
如图:
用C写一个函数判断当前系统的存储模式
#include <stdio.h>#include <windows.h>int endian(){ int i = 1; char *p = (char *)&i; return *p;}int main(){ if (1==endian()) printf("小端存储\n"); else { printf("大端存储\n"); } system("pause"); return 0;}
对上面代码进行解释,如图:
从图片可以看到,整型变量 i 在两种模式下的存储。
指针p指向了整型变量 i 的地址,并且指针p是char类型指针,代表p指向的内容为char类型变量,所以当返回 *p 的时候,会按照char类型返回,即只读取一个字节,那么我们只需要看 *p返回的值来判断系统是大端存储还是小端存储。
返回1,说明是小端模式;返回0,说明是大端模式。
那么,这个函数就是最好的判断方式了吗?
答案当然是否定的!
我们可以利用联合体(共用体)union型数据来写这个函数。
首先,先简单介绍一下union型
union关键字的用法与struct的用法非常类似。
union维护足够的空间来放置多个数据成员中的“一种”,而不是为每一个数据成员配置空间。在union中所有的数据成员共用一个空间,同一时间只能存储其中一个数据成员,所有的数据成员具有相同的起始地址。例如:
union StateMachine
{
char character;
int number;
char * str;
double exp;
};
一个union只配置一个足够大的空间来容纳最大长度的数据成员,以本例而言,最大长度是double类型,所以StateMachine的空间大小就是double数据类型的大小。
在C++里,union的成员默认属性页为public。union主要用来压缩空间。如果一些数据不可能在同一时间同时被用到,则可以使用union。
–摘自 陈正冲《C语言深度剖析》 1.17章节
如果上面的内容看懂了,则我们就可以用union来写这个函数。
代码如下:
#include <stdio.h>#include <windows.h>int endian(){ union { int i; char c; }u = {1}; return u.c;}int main(){ if (endian() == 1) printf("小端存储\n"); else if (endian()==0) { printf("大端存储\n"); } system("pause"); return 0;}
因为union型数据中的数据成员共用一个空间,具有相同的起始地址, 一个union只配置一个足够大的空间来容纳最大长度的数据成员。
所以,当我们把整型数据 1 存储在union内时,返回 u.c 便是把这块空间的第一个字节的内容返回,因此,同第一个代码的原理,可用其返回值判断大小端。
返回1,说明是小端模式;返回0,说明是大端模式。
- 关于大小端的简单介绍以及使用C写一个函数判断当前系统是大端存储还是小端存储
- 写一个程序判断当前系统存储模式是大端还是小端
- 判断当前编译器是大端存储还是小端存储
- 写一个函数判断系统是大端还是小端
- 判断一个机器使用的是大端存储还是小端存储
- 判断一个机器是大端存储还是小端存储
- 笔试面试7 如何判断一个系统的存储方式是大端还是小端
- 写一个函数判断存储空间是大端还是小端
- 写C函数判断处理器是大端还是小端
- C++ 判断是大端存储还是小端存储
- 大端小端模式简单介绍 以及三种检测大小端存储的方法
- 【C语言深度剖析】测试系统存储是大端模式还是小端模式的方法
- 关于判断cpu大端存储还是小端存储的讨论与分析
- C++学习---一道笔试题:测试当前电脑系统是大端存储还是小端存储数据
- 编写一个函数,检查当前系统是大端模式还是小端模式
- 判断系统是大端还是小端
- 判断内存存储方式是大端还是小端的代码
- 如何使用程序判断系统是大端还是小端?
- HTML 内容页,框架集,框架,<frameset><frame>
- 在ubuntu下安装php的redis扩展
- SIFT--特征描述符
- Handler内存泄漏分析及解决
- php表单以及用户输入
- 关于大小端的简单介绍以及使用C写一个函数判断当前系统是大端存储还是小端存储
- Java NIO系列教程(10):Java NIO DatagramChannel
- 使用HTML5的Canvas标签实现绘图板内拖拽元素
- socket error address already in use 的解决办法
- HDU 1003(动态规划-最大连续区间和)
- 反射_Constructor
- str和repr的区别
- 工作流后加签实现
- 交叉验证(Cross validation)