通過 Go 語(yǔ)言代碼理解大小端模式
大端模式:是指數(shù)據(jù)的高字節(jié)保存在內(nèi)存的低地址中,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的高地址中,這樣的存儲(chǔ)模式有點(diǎn)兒類似于把數(shù)據(jù)當(dāng)作字符串的存儲(chǔ)順序處理。地址由小向大增加,而數(shù)據(jù)從高位往低位放;這和我們的閱讀習(xí)慣一致。
小端模式:是指數(shù)據(jù)的高字節(jié)保存在內(nèi)存的高地址中,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的低地址中,這種存儲(chǔ)模式將地址的高低和數(shù)據(jù)位權(quán)有效地結(jié)合起來,高地址部分權(quán)值高,低地址部分權(quán)值低。這樣的存儲(chǔ)模式有利于計(jì)算機(jī)處理數(shù)據(jù)。
比如對(duì)于數(shù)據(jù):0x12345678,從高字節(jié)到低字節(jié)為:12345678,從低字節(jié)到高字節(jié)為:78563412。按照大端模式從低位 buf[0]到高位 buf[3]則應(yīng)該為:12, 34, 56, 78。按照小端模式從低位 buf[0]到高位 buf[3]則應(yīng)該為: 78,56,34,12。
現(xiàn)在用代碼測(cè)試一下 go 語(yǔ)言是小端模式還是大端模式。
package?main
import?(
?"fmt"
?"unsafe"
)
func?main()?{
?var?i?int?=?0x12345678??????????????????//定義數(shù)據(jù)
?const?size?int?=?int(unsafe.Sizeof(i))??//獲取i的長(zhǎng)度,
?ps?:=?(*[size]byte)(unsafe.Pointer(&i))?//此處size必須為const類型,不然會(huì)報(bào)錯(cuò)
?fmt.Printf("%T\n",?ps)?//*[8]byte類型
?fmt.Println(*ps)???????//打印值
?//打印存儲(chǔ)地址
?fmt.Println(&ps[0])
?fmt.Println(&ps[1])
?fmt.Println(&ps[2])
?fmt.Println(&ps[3])
?if?ps[0]?==?0x78?{
??//小端模式則ps[0]低位存放的是低字節(jié)0x78,十進(jìn)制則為120,??滿足低位存放低字節(jié),????存儲(chǔ)為??0x78563412不利用閱讀,但方便計(jì)算機(jī)進(jìn)行運(yùn)算。
??fmt.Println("系統(tǒng)為小端模式")
?}?else?{
??//大端模式則ps[0]低位存放的是高字節(jié)12,十進(jìn)制為18,滿足低位存放高字節(jié),存儲(chǔ)為ox12345678,方便閱讀,但不方便計(jì)算機(jī)進(jìn)行運(yùn)算
??fmt.Println("系統(tǒng)為大端模式")
?}
}
運(yùn)行結(jié)果:
*[8]uint8
[120?86?52?18?0?0?0?0]
0xc00000a0f8
0xc00000a0f9
0xc00000a0fa
0xc00000a0fb
系統(tǒng)為小端模式。
總結(jié)
go 語(yǔ)言底層實(shí)現(xiàn)的為小端模式,因?yàn)橛?jì)算機(jī)進(jìn)行計(jì)算時(shí),都是從低位開始進(jìn)行計(jì)算的,這樣計(jì)算效率比較高。而大端模式比較方便用戶閱讀,比較符合我們的閱讀習(xí)慣。
本文作者:v824394795
原文鏈接:https://blog.51cto.com/4075704/2521880
推薦閱讀
站長(zhǎng) polarisxu
自己的原創(chuàng)文章
不限于 Go 技術(shù)
職場(chǎng)和創(chuàng)業(yè)經(jīng)驗(yàn)
Go語(yǔ)言中文網(wǎng)
每天為你
分享 Go 知識(shí)
Go愛好者值得關(guān)注
