如何检查一个系统是大端还是小端?
(char)n == 1
呢?为什么我们必须获取地址,将其转换为char
指针,然后解引用?当使用(char)n
时,不会隐式地完成此操作吗? - J...S使用Python:
from sys import byteorder
print(byteorder)
# will print 'little' if little endian
另一个使用联合(union)的 C 代码
union {
int i;
char c[sizeof(int)];
} x;
x.i = 1;
if(x.c[0] == 1)
printf("little-endian\n");
else printf("big-endian\n");
这与 belwood 使用的逻辑相同。
std::endian
。#include <bit>
#include <iostream>
int main() {
if constexpr (std::endian::native == std::endian::little)
std::cout << "little-endian";
else if constexpr (std::endian::native == std::endian::big)
std::cout << "big-endian";
else
std::cout << "mixed-endian";
}
使用 Perl 的单行代码(Perl 应该已经默认安装在几乎所有系统上):
perl -e 'use Config; print $Config{byteorder}'
如果输出以1(最低有效字节)开头,则为小端系统。如果输出以更高位数字(最高有效字节)开头,则为大端系统。请参阅Config模块的文档。
BitConverter.IsLittleEndian
的值。if cfg!(target_endian = "big") {
println!("Big endian");
} else {
println!("Little endian");
}
在函数体外:
#[cfg(target_endian = "big")]
fn print_endian() {
println!("Big endian")
}
#[cfg(target_endian = "little")]
fn print_endian() {
println!("Little endian")
}
这就是 byteorder
crate 内部的实现方式:https://docs.rs/byteorder/1.3.2/src/byteorder/lib.rs.html#1877
[System.BitConverter]::IsLittleEndian
static union { char c[4]; unsigned long mylong; } endian_test = { { 'l', '?', '?', 'b' } };
#define ENDIANNESS ((char)endian_test.mylong)
if (ENDIANNESS == 'l') /* little endian */
if (ENDIANNESS == 'b') /* big endian */
一份C++解决方案:
namespace sys {
const unsigned one = 1U;
inline bool little_endian()
{
return reinterpret_cast<const char*>(&one) + sizeof(unsigned) - 1;
}
inline bool big_endian()
{
return !little_endian();
}
} // sys
int main()
{
if(sys::little_endian())
std::cout << "little";
}