什麼是大小端呢?如果學完c語言你還不知道這個東西那就說明基礎太差了。
假設我們有下面這個例子:
int main()
那麼這個a在記憶體中是怎麼儲存的呢?
編譯器給出的結果是:
看到這個結果是不是有點懵逼,a這個變數值是1 ,在記憶體中儲存應該是0x 00 00 00 01才對啊,為什麼編譯器給出的卻是0x 01 00 00 00
這就是我們要講到的大小端模式:
大端儲存:就是把乙個數的低位位元組序的內容存放到高位址處,高位位元組序的內容存放在低位址處。
小端儲存:就是把乙個數的低位位元組序的內容存放到低位址處,高位位元組序的內容存放在高位址處。
那我們又怎麼知道電腦到底是按照那哪種方式儲存的呢?
接下來介紹幾種檢測電腦是大端儲存還是小端儲存的方式:
注意這裡說的都是含有位元組序的型別的變數,比如int 而char型別的變數就不能用來檢測,因為它就乙個位元組,根本不存在位元組序的概念,想檢測也檢測不了
法一:利用共用體(聯合union)來檢測(常用)
為什麼用的是共用體來檢測大小端而不是結構體來檢測呢?
這是因為共用體特殊的底層結構,下面是共用體的模型:
可以看出來,char型別的變數和int 型別的變數共用的是同一塊空間,我們給 i 賦為1 那整個空間都是 1 ,如果返回的是1,那就說明當前模式是小端儲存,返回值是0 就說明當前為大端儲存。
法二:利用指標
以前我們說過乙個整形的指標每次偏移的是4個位元組,而乙個字元型別的指標每次偏移的是乙個位元組,那麼我們就可以利用這個特性寫乙個程式來檢驗:
據說檢測當前機器是大端還是小端儲存還有 更多的方法,希望知道的大佬能給小熊提出更多的解決方案。
C語言之大小端問題
1 大小端名字的由來及發展 1 在喬納森 斯威夫特的著名諷刺 格列夫遊記 中,小人國內部 成big endian和little endian兩派,區別在於一派要求從雞蛋的大頭把雞蛋打破,另一派要求從雞蛋的小頭把雞蛋打破。斯威夫特藉以諷刺英國的政黨之爭,在計算機工業中指資料儲存順序的分歧。2 後來計算...
大小端詳解
前言 本篇文章介紹資料儲存的大小端模式,大小端模式起源於吃雞蛋的典故。首先,我們看一下資料在記憶體是怎麼儲存的 從上邊我們可以看出a b在計算機中儲存的是補碼,但是順序卻倒著的,這實際上就是小端儲存 大端儲存模式 是指資料的低位位元組序儲存在記憶體的高位址中,而資料的高位位元組序儲存在記憶體的低位址...
大小端詳解(通過C語言如何判斷)
大端 big endian 和小端 little endian 的定義 大端 高位位元組排放在記憶體的低位址端,低位位元組排放在記憶體的高位址端。cpu對運算元的存放方式是從高位元組到低位元組。小端 低位位元組排放在記憶體的低位址端,高位位元組排放在記憶體的高位址端。cpu對運算元的存放方式是從低位...