版权声明:转载请注明出处,谢谢。 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
欢迎补充指正!