golangはシステムが大端なのか小端なのかを判断する

6422 ワード

goimソースコードを見ていると、次のコードが表示されます.
func IsLittleEndian() bool {
	var i int32 = 0x01020304
	u := unsafe.Pointer(&i)
	pb := (*byte)(u)
	b := *pb
	return (b == 0x04)
}

このコードは,システムが大端ストレージであるか小端ストレージであるかを判断するためである.大容量ストレージと小容量ストレージの区別方法例として、0 x 010200304:
 :  --------------------->  
 (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)
}

また、unionの各フィールド共有メモリの特性を利用したC言語の実装も提供される.
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
補足ご指摘を歓迎します!