使用C代码检查RISC-V机器的字节序

mklgxw1f  于 2023-04-05  发布在  其他
关注(0)|答案(2)|浏览(152)

有人能帮我解决这个问题吗?有一个你们大多数人都很熟悉的C代码,它检查机器的字节序。
如果它在RISC-V机器上运行,结果会是什么?
代码如下:

#include <cstdio>
int main()
{
    int x = 1;
    char* p = (char*)&x;
    printf("%d\n",(int)*p);
    return 0;
}
xfyts7mz

xfyts7mz1#

无论平台如何,程序都是有效的。对于小端计算机 * 或 * sizeof (int) == sizeof (char)的计算机,输出为1。对于所有其他平台,输出为0
由于RISC-V是little-endian,因此输出应该是1

j91ykkif

j91ykkif2#

实际上,编译器有责任告诉你这些基本的东西(在编译时就知道了),你不应该依赖这种运行时内存转换的诡计来弄清楚。
对于C语言,gcc(以及clang)定义了preprocessor macros__ORDER_LITTLE_ENDIAN____ORDER_BIG_ENDIAN__,它们告诉你。
Visual C没有,但MS说“所有本机标量类型对于Microsoft Visual C++目标平台(x86,x64,ARM,ARM64)都是小端字节序”(ref)。因此,如果定义了_MSC_VER,则可以安全地假设您是小端字节序。

#if defined __ORDER_LITTLE_ENDIAN__ || defined _MSC_VER
  printf("little\n");
#else
#  if defined __ORDER_BIG_ENDIAN__
     printf("big\n");
#  else
#    error "unknown endian-ness"
#  endif
#endif

如果微软为未来的体系结构发布了一些未来的MSVC,这将打破这种局面。虽然我完全支持健壮的代码,但我认为期望你现在编写的代码在想象的环境中工作是不公平的。
对于C++,使用std::endian(ref)从C++20标准化,这是在编译时确定的(constexpr)。

相关问题