判断大小端模式
来源:互联网 发布:mac l2tp服务器未响应 编辑:程序博客网 时间:2024/05/22 20:31
判断大小端模式
学C语言时,了解过大小端模式,但是一直都每怎么理解,对于网上查到的各种判断大小端的程序也是看的一知半解。最近再次看到大小端这个问题时,终于感觉顿悟了。以下是我的理解,如有错的地方请指出。
大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。
小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。
因为在计算机系统中,数据存储是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8位。我们知道在C语言中,很多数据类型是超过8位的,short型、long型。。。这就涉及到数据存储在内存中的排列顺序。如short型的整数4386,表示为16进制是0x1122(0x代表数字为16进制),再表示为二进制数是 0001 0001 0010 0010 (short占2个字节,所以共占16位)。这个整数在内存中的存储可能会有两种方式:
低地址 高地址 1字节 1字节 占8位 占8位 大端模式 0001 0001 0010 0010 小端模式 0010 0010 0001 0001
确定高低字节:
4386 0x1122 0001 0001 0010 0010 高字节 低字节以下程序可判断存储模式是大端还是小端:
#include<stdio.h>void byteorder(){union{short value;char union_bytes[sizeof(short)];}test; //联合体内成员共用地址空间test.value = 4386; //或0x1122if((test.union_bytes[0]==0x11)&&(test.union_bytes[1]==0x22)){printf("big endian\n");}else if((test.union_bytes[0]==0x22)&&(test.union_bytes[1]==0x11)){printf("little endian\n");}else{printf("unknown...\n");}//查看各地址单元的数据存储情况printf("size_short = %d size_char = %d\n",sizeof(short),sizeof(char));printf("& = %X\n",&(test.value)); //所输整数的首地址printf("&[0] = %X value = %d\n",&test.union_bytes[0],test.union_bytes[0]);printf("&[1] = %X value = %d\n",&test.union_bytes[1],test.union_bytes[1]);}int main(){byteorder();return 0;}输出:
解释这个程序,输出表示的是:这是小端模式,short型占用2个字节,char型占用1个字节,short型整数4386的首地址是CB9DBB10,union_bytes[0]的地址是CB9DBB10,该地址单元存储的是 00100010=34,union_bytes[1]的地址是CB9DBB11,该地址单元存储的是 00010001=17。
程序中,因为联合体union成员共享地址空间,而我们要观察整数在各个地址单元的存储情况,char型正好占1个字节,对应一个地址单元,所有用short型和char型数组作为同一个联合体成员。根据输出,分析如下:
CB9DBB11 0001 0001 0x11 17 CB9DBB10 0010 0010 0x22 34 地址 地址单元存储的二进制数据 对应的16进制 对应的10进制可知低地址存的是低字节,高地址存的是高字节,所以为小端模式。
- 大小端模式判断
- 大小端模式判断
- 判断大小端模式
- 判断大小端模式
- 判断系统大小端模式
- 判断CPU大小端模式
- 大小端模式 判断方法
- 大小端模式及其判断
- 判断CPU大小端模式
- 判断机器大小端模式
- 判断系统的大小端模式
- 判断机器的大小端模式
- C语言判断大小端模式
- C语言判断大小端模式
- 大小端模式介绍及其判断
- C 语言大小端模式判断
- 大小端模式的快速判断
- 大小端模式的快速判断
- uint8_t / uint16_t / uint32_t /uint64_t 是什么数据类型 - 大总结,看完全明白了
- c++读取word文件
- 利用textField的代理和手势来进行取消第一响应的事件来提高用户体验!
- 多图真相:Adobe Dreamweaver CC 2014.1来了-体验卓越PSD提取和诸多精彩云功能!
- [Leetcode]Excel Sheet Column Number
- 判断大小端模式
- uva11300
- 编程高手无捷径
- POJ2538 还能再水一点吗...
- grep 使用, 部分大小写查询多个 字符
- JAVA NIO 选择器
- sklearn学习(1) 数据集
- [Leetcode]Factorial Trailing Zeroes
- make: *** No rule to make target `all'. Stop.