附近那里有做网站的公司做网站一般多少钱
在看goim源代码时看到这样一段代码:
func IsLittleEndian() bool {var i int32 = 0x01020304u := unsafe.Pointer(&i)pb := (*byte)(u)b := *pbreturn (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)
}
另外给出C语言的实现,利用了union各字段共享内存的特性:
int byteOrder() {union {short value;char bytes[2];} u;u.value = 0x0102;if (u.bytes[0] == 1 && u.bytes[1] == 2) {return 1; // big endian} else if (u.bytes[0] == 2 && u.bytes[1] == 1) {return 2; // little endian} else {return -1; // unknown}
}
参考:
https://blog.csdn.net/qq_34992845/article/details/53350977
欢迎补充指正!