go语言中大小端模式的个人理解

v824394795 · · 2426 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

大端模式:是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据
当作字符串的存储顺序处理。地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。
小端模式:是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有
效地结合起来,高地址部分权值高,低地址部分权值低。这样的存储模式有利于计算机处理数据。
比如对于数据: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语言底层实现的为小端模式,因为计算机进行计算时,都是从低位开始进行计算的,这样计算效率比较高。
而大端模式比较方便用户阅读,比较符合我们的阅读习惯。


有疑问加站长微信联系(非本文作者)

本文来自:51CTO博客

感谢作者:v824394795

查看原文:go语言中大小端模式的个人理解

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2426 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传