通过 Go 语言代码理解大小端模式
大端模式:是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串的存储顺序处理。地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。
小端模式:是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。这样的存储模式有利于计算机处理数据。
比如对于数据:0x12345678,从高字节到低字节为:12345678,从低字节到高字节为:78563412。按照大端模式从低位 buf[0]到高位 buf[3]则应该为:12, 34, 56, 78。按照小端模式从低位 buf[0]到高位 buf[3]则应该为: 78,56,34,12。
现在用代码测试一下 go 语言是小端模式还是大端模式。
package main
import (
"fmt"
"unsafe"
)
func main() {
var i int = 0x12345678 //定义数据
const size int = int(unsafe.Sizeof(i)) //获取i的长度,
ps := (*[size]byte)(unsafe.Pointer(&i)) //此处size必须为const类型,不然会报错
fmt.Printf("%T\n", ps) //*[8]byte类型
fmt.Println(*ps) //打印值
//打印存储地址
fmt.Println(&ps[0])
fmt.Println(&ps[1])
fmt.Println(&ps[2])
fmt.Println(&ps[3])
if ps[0] == 0x78 {
//小端模式则ps[0]低位存放的是低字节0x78,十进制则为120, 满足低位存放低字节, 存储为 0x78563412不利用阅读,但方便计算机进行运算。
fmt.Println("系统为小端模式")
} else {
//大端模式则ps[0]低位存放的是高字节12,十进制为18,满足低位存放高字节,存储为ox12345678,方便阅读,但不方便计算机进行运算
fmt.Println("系统为大端模式")
}
}
运行结果:
*[8]uint8
[120 86 52 18 0 0 0 0]
0xc00000a0f8
0xc00000a0f9
0xc00000a0fa
0xc00000a0fb
系统为小端模式。
总结
go 语言底层实现的为小端模式,因为计算机进行计算时,都是从低位开始进行计算的,这样计算效率比较高。而大端模式比较方便用户阅读,比较符合我们的阅读习惯。
本文作者:v824394795
原文链接:https://blog.51cto.com/4075704/2521880
推荐阅读
站长 polarisxu
自己的原创文章
不限于 Go 技术
职场和创业经验
Go语言中文网
每天为你
分享 Go 知识
Go爱好者值得关注
评论