golangはシステムが大端なのか小端なのかを判断する
6422 ワード
goimソースコードを見ていると、次のコードが表示されます.
このコードは,システムが大端ストレージであるか小端ストレージであるかを判断するためである.大容量ストレージと小容量ストレージの区別方法例として、0 x 010200304:
つまり、大端:元の低位(例えば04)は高住所に置かれていた.小端:元の低位(例えば04)は低アドレスに置かれています.
では、上記のコードを分析します.
また、unionの各フィールド共有メモリの特性を利用したC言語の実装も提供される.
参照先:https://blog.csdn.net/qq_34992845/article/details/53350977
補足ご指摘を歓迎します!
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
補足ご指摘を歓迎します!