先上結論 , 咱們預設人讀位元組時 , 從右往左讀 , 這就是小端序 , 因為計算機處理的時候會從低位到高位處理 , 和人的習慣正好相反
位元組序,又稱端序或尾序(英語中用單詞:endianness
在幾乎所有的平台上,多位元組物件都被儲存為連續的位元組序列。例如在 go 語言中,乙個型別為int
的變數x
位址為0x100
,那麼其指標&x
的值為0x100
。且x
的四個位元組將被儲存在記憶體的0x100, 0x101, 0x102, 0x103
位置。
位元組的排列方式有兩個通用規則:
上面的文字描述有點抽象,我們拿乙個例子來解釋一下位元組排列時的大端序和小端序。
在記憶體中存放整型數值168496141
,這個數值在用大端序和小端序排列時的在記憶體中的示意圖如下:
很多人會問,為什麼會有位元組序,統一用大端序不行嗎?答案是,計算機電路先處理低位位元組,效率比較高,因為計算都是從低位開始的。所以,計算機的內部處理都是小端位元組序。在計算機內部,小端序被廣泛應用於現代 cpu 內部儲存資料;而在其他場景,比如網路傳輸和檔案儲存則使用大端序。
用於操作大端序資料,littleendian
用於操作小端序資料,這兩個變數所對應的資料型別都實現了byteorder
介面。
package main
import (
"encoding/binary"
"fmt"
"unsafe"
)const int_size = int(unsafe.sizeof(0)) //64位作業系統,8 bytes
//判斷我們系統中的位元組序型別
func systemedian() else
fmt.printf("temp: 0x%x,%v\n",bs[0],&bs[0])
fmt.printf("temp: 0x%x,%v\n",bs[1],&bs[1])
fmt.printf("temp: 0x%x,%v\n",bs[2],&bs[2])
fmt.printf("temp: 0x%x,%v\n",bs[3],&bs[3])
}//測試大端序
func testbigendian()
//測試小端序
func testlittleendian()
func main()
&i: 0xc000084000
system edian is little endian
temp: 0x4,0xc000084000
temp: 0x3,0xc000084001
temp: 0x2,0xc000084002
temp: 0x1,0xc000084003
16909060 use big endian:
int32 to bytes: [1 2 3 4]
int32 to bytes: 01020304
bytes to int32: 16909060
1020304 use little endian:
int32 to bytes: 04030201
bytes to int32: 16909060
大端序是從左往右符合人的習慣 , 小端序是從右往左 , 不符合人的習慣 , 上面的** , 第乙個是顯示當前系統是大端序還是小端序
後面兩個是儲存int32 的兩種方式
大端位元組序和小端位元組序
簡單介紹 位元組序是由cpu和os對多位元組變數的記憶體儲存順序不同而產生的 小端位元組序 在表示變數的記憶體位址的起始位址存放低位元組,高位元組順序存放 大端位元組序 在表示變數的記憶體位址的起始位址存放高位元組,低位元組順序存放,例如 變數的值0xabcd uint32 t htonl 主機位元...
大端位元組序和小端位元組序
title 大端位元組序和小端位元組序 格列佛遊記 中記載了兩個征戰的強國,你不會想到的是,他們打仗竟然和剝雞蛋的姿勢有關。很多人認為,剝雞蛋時應該打破雞蛋較大的一端,這群人被稱作 大端 big endian 派 可是當今皇帝的祖父小時候吃雞蛋的時候碰巧將乙個手指弄破了。所以,他的父親 當時的皇帝 ...
大端位元組序和小端位元組序
計算機硬體有兩種儲存資料的方式 大端位元組序 big endian 和小端位元組序 little endian 舉例來說,數值0x2211使用兩個位元組 一位元組是8bit 儲存 高位位元組是0x22,低位位元組是0x11。大端位元組序 低位位元組在高位址,高位位元組低位址上。這是人類讀寫數值的方法...