Jangan gunakan a union
!
C ++ tidak mengizinkan jenis hukuman via union
s!
Membaca dari bidang persatuan yang bukan bidang terakhir yang ditulis untuk adalah perilaku yang tidak terdefinisi !
Banyak kompiler mendukungnya sebagai ekstensi, tetapi bahasa tidak memberikan jaminan.
Lihat jawaban ini untuk lebih jelasnya:
https://stackoverflow.com/a/11996970
Hanya ada dua jawaban valid yang dijamin portabel.
Jawaban pertama, jika Anda memiliki akses ke sistem yang mendukung C ++ 20,
adalah menggunakan std::endian
dari <type_traits>
header.
(Pada saat penulisan, C ++ 20 belum dirilis, tetapi kecuali ada sesuatu yang mempengaruhi std::endian
inklusi, ini akan menjadi cara yang disukai untuk menguji endianness pada waktu kompilasi dari C ++ 20 dan seterusnya.)
C ++ 20 Selanjutnya
constexpr bool is_little_endian = (std::endian::native == std::endian::little);
Sebelum C ++ 20, satu-satunya jawaban yang valid adalah untuk menyimpan integer dan kemudian memeriksa byte pertamanya melalui jenis hukuman.
Berbeda dengan penggunaanunion
s, ini diizinkan oleh sistem tipe C ++.
Penting juga untuk diingat bahwa untuk portabilitas optimal static_cast
harus digunakan,
karena reinterpret_cast
implementasi didefinisikan.
Jika suatu program mencoba untuk mengakses nilai yang tersimpan dari suatu objek melalui nilai lain selain salah satu dari jenis berikut perilaku tidak terdefinisi: ... a char
atau unsigned char
ketik.
C ++ 11 Selanjutnya
enum class endianness
{
little = 0,
big = 1,
};
inline endianness get_system_endianness()
{
const int value { 0x01 };
const void * address = static_cast<const void *>(&value);
const unsigned char * least_significant_address = static_cast<const unsigned char *>(address);
return (*least_significant_address == 0x01) ? endianness::little : endianness::big;
}
C ++ 11 Selanjutnya (tanpa enum)
inline bool is_system_little_endian()
{
const int value { 0x01 };
const void * address = static_cast<const void *>(&value);
const unsigned char * least_significant_address = static_cast<const unsigned char *>(address);
return (*least_significant_address == 0x01);
}
C ++ 98 / C ++ 03
inline bool is_system_little_endian()
{
const int value = 0x01;
const void * address = static_cast<const void *>(&value);
const unsigned char * least_significant_address = static_cast<const unsigned char *>(address);
return (*least_significant_address == 0x01);
}