大端序與小端序

2021-09-06 17:40:10 字數 1805 閱讀 7341

簡單點說,就是位元組的儲存順序,如果資料都是單位元組的,那怎麼儲存無所謂了,但是對於多位元組資料,比如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

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

方法一

boolisbigendian()

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

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

0x0012fe88  01

0x0012fe89  00

0x0012fe8a  00

0x0012fe8b  00

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

boolisbigendian()

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

大端序與小端序

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

大端序與小端序

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

大端序小端序

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