golang判断系统是大端还是小端存储

版权声明:转载请注明出处,谢谢。 https://blog.csdn.net/butterfly5211314/article/details/83303942

在看goim源代码时看到这样一段代码:

func IsLittleEndian() bool {
	var i int32 = 0x01020304
	u := unsafe.Pointer(&i)
	pb := (*byte)(u)
	b := *pb
	return (b == 0x04)
}

这段代码是为了判断系统是大端存储还是小端存储。
如何区分大端存储还是小端存储?
以0x01020304为例子:

地址:低 ---------------------> 高
大端(16进制):   01 02 03 04
小端(16进制):   04 03 02 01

也就是说:
大端:原来低位的(如04)放在高地址。
小端:原来低位的(如04)放在低地址。

那么来分析一下上面的代码:

func IsLittleEndian() bool {
	var i int32 = 0x01020304
	
	// 下面这两句是为了将int32类型的指针转换为byte类型的指针
	u := unsafe.Pointer(&i)
	pb := (*byte)(u)
	
	b := *pb // 取得pb位置对应的值
	
	// 由于b是byte类型的,最多保存8位,那么只能取得开始的8位
	// 小端: 04 (03 02 01)
	// 大端: 01 (02 03 04)
	return (b == 0x04)
}

参考:
https://blog.csdn.net/qq_34992845/article/details/53350977

欢迎补充指正!

猜你喜欢

转载自blog.csdn.net/butterfly5211314/article/details/83303942