浅谈大端和小端
最近在看關于大端小端的問題首先請允許我引用一段
一、大端模式和小端模式的起源
? ? ? ? 關于大端小端名詞的由來,有一個有趣的故事,來自于Jonathan Swift的《格利佛游記》:Lilliput和Blefuscu這兩個強國在過去的36個月中一直在苦戰。戰爭的原因:大家都知道,吃雞蛋的時候,原始 的方法是打破雞蛋較大的一端,可以那時的皇帝的祖父由于小時侯吃雞蛋,按這種方法把手指弄破了,因此他的父親,就下令,命令所有的子民吃雞蛋的時候,必須 先打破雞蛋較小的一端,違令者重罰。然后老百姓對此法令極為反感,期間發生了多次叛亂,其中一個皇帝因此送命,另一個丟了王位,產生叛亂的原因就是另一個 國家Blefuscu的國王大臣煽動起來的,叛亂平息后,就逃到這個帝國避難。據估計,先后幾次有11000余人情愿死也不肯去打破雞蛋較小的端吃雞蛋。 這個其實諷刺當時英國和法國之間持續的沖突。Danny Cohen一位網絡協議的開創者,第一次使用這兩個術語指代字節順序,后來就被大家廣泛接受。
?
二、什么是大端和小端
大端是將存儲數據的低位存放在高地址上,高位存放在低地址上,如int a= 0x12345678這個十六進制的數分為4份
0x12 0x34 0x56 0x78(數據的低位)
低地址 -> 高地址
感覺像是字符串是存放方式"0x12345678" 是字符串依次存放
小端是將數據的低位存放在低地址,高位存放在高地址上.如int a= 0x12345678這個十六進制的數分為4份
0x78(數據的低位) 0x56 0x34 0x12 //一開始我居然不知道十六進制的數據居然是從右往左
低地址 -> 高地址
這類更加符合我們的邏輯思維,而且一般的*86的都是小端
編寫一個程序判斷
1
#include <stdio.h>
int main (void)
{
?? ?int a = 0x12345678;
?? ?int *c = a;
?? ?short *b = NULL;
?? ?b = (short *) c;
?? ?if (b == 0x5678)
?? ??? ?printf ("Big Endian\n");
?? ?else
?? ??? ?printf ("Little Endian\n");
?? ?return 0;
?? ??? ?
}
因為共用體union所有成員存放順序從低地址存放
#include <stdio.h>
union st
{
?? ?int a;
?? ?char b;
} s;
int main (void)
{
?? ?s.a = 0x1234;
?? ?if (s.b == 0x34)
?? ??? ?printf ("Llttle Endian!\n");
?? ?else
?? ??? ?printf ("Big Endian!\n");
?? ?return 0;
}
?
?
?
?
轉載于:https://www.cnblogs.com/tony1/p/3726678.html
總結
- 上一篇: dwr 推送实现
- 下一篇: ubuntu 软件包管理工具 dpkg,