标签:大小 联合 turn als ges 赋值 处理 传输数据 需要
1. 为什么会产生两种模式:
在计算机中我们是以字节为单位的,每一个地址单元都对应着一个字节,一个字节就是8位,c语言中char类型之外,还
有四个字节的int,个字节的longlong类型,并且除了对于超过8位的处理器,比如32位处理器,64位处理器,由于寄存器的宽
度、大于一个字节就必然存在着字节安排的问题,因此就出现了大端模式和小端模式
2.两种模式的定义:
在计算机的结构体系中,对于字节,字等的存储机制有所不同,,目前在各个体系的计算机中通常采用的字节存储机制
主要有两种:大端模式和小端模式,大端模式:就是将高位的数据(权重较高的数据)存放在地址上,小端模式:就是
将低位的数据(权重较低的数据)存放在低位的地址上,采用大端模式存取数据比较符合人的思维,但是采用小端模式
存放数据更有利于计算机处理,所以到目前为止,谁好谁坏还没有定论。
例子:
如果定义一个整型(int)的变量:int a=0x12345678,这个整型变量在内存中的存储在大小端的不同的模式下存储情况
大端模式的存储由下图所示:
小端模式的存储如下图所示:
注意:这里说明一点,存储是以字节为单位的,所以一个字节内的数据是不用遵循大端模式和小端模式的,就像小端模式中是0x78,而
不是0X87
3.大端和小端的应用:
谈到字节排序问题就必定会牵扯到两大cpu的派系,那就是motorola的powerPC系列的CPU和intel的X86系列,powerPC系列
的CPU采用的是大端模式,intel的X86系列采用的是小端模式
大端模式:网络,大多通信协议是大端的,powerPC,IBM,Sun
小端模式:主机,一般操作系统是小端的,X86,DEC
ARM既可以工作在大端模式也可以工作在小端模式
4. 测试本地设备采用的是大端模式还是小端模式:
第一种方法:定义一个大于一个字节的数据类型的变量假设为变量为a,用小于变量a的数据类型的指针进行强制转化
将变量地址进行截断,然后再用*间接访问该地址中所存的数据,看看是高位数据还是低位数据,就可以得出结果了,
代码如下图所示:
#include <stdio.h> bool isbigendian () { int a=0x12345678; char b=(*(char*)&a); if (b=0x1) { return true; } return false; } int main () { if(isbigendian ()) { printf ("该设备下是大端模式\n"); } else { printf ("该设备下是小端模式\n"); } return 0; }
第二种方法:运用联合体的特性:联合体union在任何同一时刻联合体都只存放一个被选中的成员,并且所有所有成员都是
从低地址开始存放,;利用这一特性,我们可以定义一个联合体,先定义一个字节数大于1变量例如int a;在定义一个字
节数小于变量a的变量,然后将变量a进行赋值,然后访问变量b,如果是高位上的数字就是大端模式,如果是低位上的数
字就是小端模式,代码如下图所示:
#include <stdio.h> bool isbigendian1 () { union sun { short a; char b; }sun; sun.a=0x1234; if (sun.b=0x12) { return true; } else { return false ; } } int main () { if (isbigendian1 ()) { printf ("该设备是使用的是大端模式\n"); } else { printf ("该设备使用的是小端模式\n"); } return 0; }
5.通信:
网络上传输数据普遍采用的是大端模式,powerPC处理器主导网络市场,可以绝大多数的通信设备都使用的是powerPC处
理器这也可能就是网络上绝大多数的协议采用的是大端模式的原因,因此,在使用小端模式处理器需要使用网络通信时
需要在软件中处理端模式的转变
标签:大小 联合 turn als ges 赋值 处理 传输数据 需要
原文地址:http://www.cnblogs.com/smile-812/p/7707245.html