有人能帮我解决这个问题吗?有一个你们大多数人都很熟悉的C代码,它检查机器的字节序。如果它在RISC-V机器上运行,结果会是什么?代码如下:
#include <cstdio> int main() { int x = 1; char* p = (char*)&x; printf("%d\n",(int)*p); return 0; }
xfyts7mz1#
无论平台如何,程序都是有效的。对于小端计算机 * 或 * sizeof (int) == sizeof (char)的计算机,输出为1。对于所有其他平台,输出为0。由于RISC-V是little-endian,因此输出应该是1。
sizeof (int)
sizeof (char)
1
0
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,则可以安全地假设您是小端字节序。
__ORDER_LITTLE_ENDIAN__
__ORDER_BIG_ENDIAN__
_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)。
std::endian
2条答案
按热度按时间xfyts7mz1#
无论平台如何,程序都是有效的。对于小端计算机 * 或 *
sizeof (int)
==sizeof (char)
的计算机,输出为1
。对于所有其他平台,输出为0
。由于RISC-V是little-endian,因此输出应该是
1
。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
,则可以安全地假设您是小端字节序。如果微软为未来的体系结构发布了一些未来的MSVC,这将打破这种局面。虽然我完全支持健壮的代码,但我认为期望你现在编写的代码在想象的环境中工作是不公平的。
对于C++,使用
std::endian
(ref)从C++20标准化,这是在编译时确定的(constexpr)。