如何检查系统是大端还是小端?

ana*_*and 53 endianness

如何检查系统是大端还是小端?

bel*_*ood 67

在C,C++中

int n = 1;
// little endian if true
if(*(char *)&n == 1) {...}
Run Code Online (Sandbox Code Playgroud)

另请参见:Perl版本

  • 很好的答案,但这提供了一个很好的图表:http://stackoverflow.com/a/12792301/803801 (12认同)
  • 仅使用 char 是行不通的。由于转换为 char 会导致系统从 int 转换为 char。它总是会返回 true。使用强制转换为指针并取消引用将指针放置到 N 的第一个字节,然后取消引用第一个字节。 (4认同)
  • 你能告诉我为什么我们不能只使用`(char)n == 1`吗?为什么我们必须获取地址,将其转换为`char`指针然后取消引用?不会隐式地使用`(char)n`吗? (2认同)
  • 演员表并不是转换。如果是 Big Endian,那么 N 的第一个字节是零 - 那么这如何导致 true 呢? (2认同)

Nik*_*rov 29

在Python中:

from sys import byteorder
print(byteorder)
# will print 'little' if little endian
Run Code Online (Sandbox Code Playgroud)


Nee*_*raj 10

另一个使用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");
Run Code Online (Sandbox Code Playgroud)

这与贝尔伍德使用的逻辑相同.

  • 我认为这不符合标准:你可能只从你最后写过的枚举中读取字段,否则可能是未定义的行为,或者我错了? (3认同)

Qui*_*inn 9

在 Rust 中(use不需要板条箱或声明)

在函数体中:

if cfg!(target_endian = "big") {
    println!("Big endian");
} else {
    println!("Little endian");
}
Run Code Online (Sandbox Code Playgroud)

在函数体之外:

#[cfg(target_endian = "big")]
fn print_endian() {
    println!("Big endian")
}

#[cfg(target_endian = "little")]
fn print_endian() {
    println!("Little endian")
}
Run Code Online (Sandbox Code Playgroud)

这就是byteorder板条箱内部所做的事情:https ://docs.rs/byteorder/1.3.2/src/byteorder/lib.rs.html#1877


Evg*_*Evg 8

在 C++20 中使用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";
}
Run Code Online (Sandbox Code Playgroud)


Guf*_*ffa 7

如果您使用的是.NET:检查值BitConverter.IsLittleEndian.


Jua*_*gui 7

在 Powershell 中

[System.BitConverter]::IsLittleEndian
Run Code Online (Sandbox Code Playgroud)


wei*_*eld 5

Perl的单行代码(应在几乎所有系统上默认安装):

perl -e 'use Config; print $Config{byteorder}'
Run Code Online (Sandbox Code Playgroud)

如果输出以1(最低有效字节)开头,则为小尾数系统。如果输出以较高的数字(最高有效字节)开头,则为big-endian系统。请参阅Config模块的文档。