大端模式-小端模式详解
作者:互联网
大端模式(big endian),小端模式(little endian)指的是什么?
端(endian)模式是指计算机中字节的存储顺序。地址的高低与字节的高位和低位的对应关系就有了大端和小端的区别。
假设我们声明一个int类型的变量,附上十六进制值。
int x=0x12345678//地址为0x100
大端模式:高位字节存放在低地址
0x100 | 0x101 | 0x102 | 0x103 |
---|---|---|---|
12 | 34 | 56 | 78 |
小端模式:高位字节放在高地址
0x100 | 0x101 | 0x102 | 0x103 |
---|---|---|---|
78 | 56 | 34 | 12 |
备注:0x100是低地址,而高位字节的十六进制是0x12。
下面思考一下下面代码分别在大端模式和小端模式下的输出结果?(32位系统,int4字节,short2字节)
#include<stdio.h>
int main()
{
int x=0x12345678;
printf("%x\n",short(x));
return 0;
}
big endian | little endian |
---|---|
1234 | 5678 |
代码解释:在小端模式下,地址从低到高,4个字节分别存放0x78 0x56 0x34 0x12;而short类型只有2个字节,强制类型转换时获取大端是低地址的两个字节的内容即0x78 0x56,所以最终结果为5678,同理可得大端模式下的结果。
在同一台计算机中,内部是大端还是小端对我们没有什么实质影响,那么为什么我们需要知道大端和小端模式呢?
首先,在不同类型的机器间通过网络传递二进制数据时,字节顺序会成为问题。比如:当小端模式机器产生的数据被发送到大端模式机器或者相反时,接受程序会发现,字里的字节成了反序。为了避免这类问题,网络应用程序的代码编写必须尊搜已建立的关于字节顺序的规则,以确保发送方机器将它的内部表示转换成网络标准,而接收方机器则将网络标准转换成它的内部表示。其次,当阅读表示整数数据的字节序列时,非常需要了解字节存储的顺序。小端机器级程序表示时,经常会将字节按照相反的顺序显示,而书写字节序列的自然方式是最低位字节在左边,而最高位字节在右边。最后,当编写规避正常的类型系统的程序时需要清楚大端,小端模式比如:上面的int到short的强制类型转换,我们清楚了机器是大端还是小端模式才能知道结果,这在有得时候是非常有用的。
那么,如何判断机器是大端还是小端模式呢
大端模式大多源自于以前的Digital Equipment公司(现在是在Compaq公司的一部分)的机器,Intel的机器也采用大端模式。IBM\Motorola和Sun Microsystems的大多数机器都采用小端模式。
最稳妥的方式还是自己编程判断,通过上面强制类型转换的方式就可以进行判断,我们还可以通过union来进行判断,因为union内的变量共用同一块存储空间并且都是从低地址开始,代码如下:
#include<stdio.h>
union A{
short b;
char c;
}x;
int main()
{
x.b=0x0001
if(c==1)
printf("小端\n");
else
printf("大端\n");
return 0;
}
趣味故事:
"…我下面要告诉你的是,Lilliput和Blefuscu这两大强国在过去三十六个月里一直在苦战。战争开始是由于以下的原因:我们大家都认为,吃鸡蛋前,原始的方法是打碎鸡蛋较大的一端,可是当今皇帝的祖父小时候吃鸡蛋,一次按古法打鸡蛋时碰巧将一个手指弄破了,因此他的父亲,当时的皇帝就下了一道诏令,命令全体臣民吃鸡蛋时打破鸡蛋较小的一段,违令者重罚。老百姓们对这项命令极为反感,历史告诉我们,由此层发生过六次叛乱,其中一个皇帝送了命,另一个丢了王位。这些叛乱大多都是由Blefuscu的国王大臣们煽动起来的。在叛乱平息后,流亡的人总是逃到那个帝国去寻求避难。据统计,先后几次有一万一千人情愿受死也不肯打破鸡蛋较小的一端。关于一争端,层出版过几百本大部著作。不过大端派的书一直是受禁的,法律也不规定该派的任何人不得做官。”(译文来自将剑锋译《格利佛游记》第一卷第4章。)
标签:小端,机器,字节,int,模式,详解,大端 来源: https://blog.csdn.net/qq_41789960/article/details/111213088