作業系統 位元組序中的大端序和小端序的區別

2021-10-20 00:25:39 字數 1949 閱讀 6663

先上結論 , 咱們預設人讀位元組時 , 從右往左讀 , 這就是小端序 , 因為計算機處理的時候會從低位到高位處理 , 和人的習慣正好相反

位元組序,又稱端序尾序(英語中用單詞: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。大端位元組序 低位位元組在高位址,高位位元組低位址上。這是人類讀寫數值的方法...