分享

CPU的大端小端,了解一下

 Kuai2012 2022-04-26
大端小端这个词的来源
《程序设计实践》第9章中提到,“大端”和“小端”可以追溯到1726年的JonathanSwift的《格列佛游记》,其中一篇讲到有两个国家因为吃鸡蛋究竟是先打破较大的一端还是先打破较小的一端而争执不休,甚至爆发了战争。1981年10月,Danny Cohen的文章《论圣战以及对和平的祈祷》(On holy wars and a plea for peace)将这一对词语引入了计算机界。这么看来,所谓大端和小端,也就是big-endian和little-endian,其实是从描述鸡蛋的部位而引申到计算机地址的描述,
为什么会有大小端
在计算机系统中,数据的存放是以byte为单位的,每个内存地址存放一个byte的数据。但是在C语言中除了1byte的char之外,还有int、float、double等数据类型,其占字节数大于1byte,具体大小由编译器和CPU决定。对于位数大于8bit的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一byte,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。
什么是大端小端
小端模式(Litte-Endian):数据中的高位放置在内存的高地址,数据的低位放置在内存的低地址。
大端模式(Big-Endian): 数据中的高位放置在内存的低地址,数据的低位放置在内存的高地址。
上面的表述比较绕,下面通过一个例子来说明大端模式和小端模式,比如内存中需要存放0x11223344这个数据,那么在大端小段下的存放是怎么样的呢,如下表:
物理地址
小端模式
大端模式
0x80008000
0x44
0x11
0x80008001
0x33
0x22
0x80008002
0x22
0x33
0x80008003
0x11
0x44
如何判别CPU是大端还是小端
通常CPU设计过程中就设定好了大小端的模式,比如PowerPC .IBM为大端模式,X86、TC27x为小端模式,ARM即可为大端,也可以小端模式
那在我们懒得去查手册的时候,我们可以通过简单的代码来确定CPU的工作模式。
int main(void){ union{ int num; char ch; } data;
data.num = 1;
if(data.ch == 1){ printf("Little-endian\n"); }else{ printf("Big-endian\n"); } return 0;}
通过利用联合体中各成员公用一段内存,data.num =1 是数据的低位,如果 1 被存储在 data 的低字节,则data.ch 也为1,则为小端模式,如果 1 被存储在 data 的高字节,这个时候 data.ch 的值就是 0,则为大端模式。
参考:本文参考网络资源,侵删

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多