何為大端序,小端序?

2021-06-26 08:48:26 字數 1848 閱讀 8870

簡單點說,就是位元組的儲存順序,如果資料都是單位元組的,那怎麼儲存無所謂了,但是對於多位元組資料,比如int,double等,就要考慮儲存的順序了。注意位元組序是硬體層面的東西,對於軟體來說通常是透明的。再說白一點,位元組序通常只和你使用的處理器架構有關,而和程式語言無關,比如常見的intel x86系列就是小端序。

資料的高位位元組存放在位址的低端 低位位元組存放在位址高階

資料的高位位元組存放在位址的高階 低位位元組存放在位址低端

位元組的高位與低位

舉個例子,int a = 0x12345678 ; 那麼左邊12就是高位位元組,右邊的78就是低位位元組,從左到右,由高到低,(注意,高低乃相對而言,比如56相對於78是高位元組,相對於34是低位元組)

位址的高階與低端

0x00000001

0x00000002

0x00000003

0x00000004

從上倒下,由低到高,位址值小的為低端,位址值大的為高階。

看看兩種方式如何儲存資料,假設從位址0x00000001處開始儲存十六進製制數0x12345678,那麼

bit-endian 如此存放(按原來順序儲存)

0x00000001           -- 12

0x00000002           -- 34

0x00000003           -- 56

0x00000004           -- 78

little-endian 如此存放(顛倒順序儲存)

0x00000001           -- 78

0x00000002           -- 56

0x00000003           -- 34

0x00000004           -- 12

乙個很好的記憶方法是,大端序是按照數字的書寫順序進行儲存的,而小端序是顛倒書寫順序進行儲存的。

方法一

bool isbigendian()

開啟vs的記憶體視窗,看一下a的儲存方式,一目了然

由於a是int,所以佔四個位元組,其值是00000001,儲存方式如下。所以a[3]是0,不是大端序。乙個更標準的寫法是將a[3]替換為a[sizeof(int) - 1]。

0x0012fe88  01

0x0012fe89  00

0x0012fe8a  00

0x0012fe8b  00

方法二,使用union,原理見後面的面試題。

bool isbigendian()

c; c.a =0x0102 ;

if(c.b ==1)

return

true ;

else

return

false ;

}

來道題鞏固一下,下面**輸出什麼?

union u

a ;int main(void)

這個題,要看你使用的是什麼系列的cpu,姑且假設是intel系列的。union是乙個特殊的結構,其中所有成員共享結乙個記憶體位址,任意時間只能儲存乙個成員,上面的union大小為4個位元組,所以上面的**儲存完字元1和2之後,union的儲存貌似應該是0x31320000,31和32分別是字元'1'和'2'的十六進製制ascii碼(注意是字元1和2,而不是整數),但是intel系列的cpu都是按照小端序儲存的,所以,正確的順序是0x00003231,對應的十進位制數是12849,你答對了麼?

關於位元組序的詳細內容,請看wikipedia的介紹

the end

大端序小端序

摘自 linux核心程式設計 比如看這個 十六進製制數0x12345678的表示 32位大端序表示 1234 56780 8 1624 32位小端表示 7856 341208 1624 備註 0x12345678中 12 是高位,78是低位。x86體系結構是用小端序。程式設計檢視自己電腦是大端還是小...

大端序和小端序

一 概述 位元組序,又稱端序,尾序,英文 endianness。在電腦科學領域中,位元組序是指存放多位元組資料的位元組 byte 的順序,典型的情況是整數在記憶體中的存放方式和網路傳輸的傳輸順序。endianness有時候也可以用指位序 bit 大小端序跟硬體的體系結構有關,所有x86系列的pc機都...

大端序和小端序

在socket程式設計的時候會遇到端序的問題。位元組序和程式語言無關,和硬體的儲存方式有關。intel的cpu使用小端序,而網路上傳輸資料使用大端序。在我的理解中,大端序和小端序並沒有哪種更好,只是儲存的方式不同而已。記憶體中我們只關心1byte,位址的基本單位也是byte。位元組序不關心1個byt...