是否有一种编程方式来检测您是否在大端或小端架构上?我需要能够编写将在Intel或PPC系统上执行的代码并使用完全相同的代码(即没有条件编译).
我的印象是访问union除最后一个成员之外的成员是UB,但我似乎无法找到一个可靠的参考(除了声称它是UB但没有标准支持的答案).
那么,这是不确定的行为?
是否有一行宏定义来确定机器的字节顺序.我使用以下代码,但将其转换为宏将太长.
unsigned char test_endian( void )
{
int test_var = 1;
unsigned char test_endian* = (unsigned char*)&test_var;
return (test_endian[0] == NULL);
}
Run Code Online (Sandbox Code Playgroud) 我已就此主题提出了很多问题,但到目前为止找不到任何解决方案.这里提到了一个自然的解决方案:在编译时确定字节序.
但是,评论中提到的相关问题和答案相同.
通过一些修改,我能够在-std=c++11没有任何警告的情况下使用g ++和clang ++()编译类似的解决方案.
static_assert(sizeof(char) == 1, "sizeof(char) != 1");
union U1
{
int i;
char c[sizeof(int)];
};
union U2
{
char c[sizeof(int)];
int i;
};
constexpr U1 u1 = {1};
constexpr U2 u2 = {{1}};
constexpr bool IsLittleEndian ()
{
return u1.i == u2.c[0]; // ignore different type comparison
}
static_assert(IsLittleEndian(), "The machine is BIG endian");
Run Code Online (Sandbox Code Playgroud)
演示.
这可以被认为是决定字节序的确定性方法还是错过类型惩罚或其他什么?
请不要将此标记为重复.该建议后重复实际上是在说有关运行时决定.最重要的是,那里的答案都没有回答我的问题.
我需要uint16_t用C/C++中的两个字节读取一个.所以,我需要决定我的代码编译的平台的endian格式.我目前在GNU C扩展中使用宏.
// 'size' is 'uint16_t' and read from big-endian format.
// So if the platform is little-endian, I need to flip the btyes.
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
size = ( size << 8 ) | ( size >> 8 );
#endif
Run Code Online (Sandbox Code Playgroud)
性能在我的用例中至关重要,因此ntohs或htons不适合我.我需要在预处理时间内进行这种endian检查.
题.是否有标准方法(语言标准)来进行预处理?
如果您有一个二进制输出流,并将整数写入 32 位 Windows 计算机上的文件。那么您是否能够在 64 位 Windows 计算机上从同一个文件中读取相同的整数?
我的猜测是没有。由于 32 位计算机上的整数是 4 个字节,而 64 位计算机上的整数是 8 个字节。
下面的代码也可以工作,而无论操作系统、计算机体系结构和数据类型如何,文件都必须能够从 64 位和 32 位计算机读取和写入。如果不是,人们怎么能做到这一点,而文件必须是二进制形式。
std::ofstream ofs("example.bin", std::ios::binary);
int i = 128;
ofs.write((char*) (&i), sizeof(i));
ofs.close();
Run Code Online (Sandbox Code Playgroud)
std::ifstream ifs("example.bin", std::ios::binary);
int i = 0;
ifs.read((char*) (&i), sizeof(i));
ifs.close();
Run Code Online (Sandbox Code Playgroud) 如何在编译时确定我的平台是小端还是大端?我已经看到很多方法可以在运行时使用强制转换来确定,以及一些与平台相关的选项.有便携式或标准方式吗?
constexpr bool is_little_endian = ?;
Run Code Online (Sandbox Code Playgroud) 我想要变得懒惰并编写一些代码,如果目标机器的字节顺序与我自己的字节序不同,那么它将会破坏.但我想知道什么时候它会中断,所以如果有必要我可以解决它.
浮点数和整数的字节顺序是编译程序的属性,这样我可以在编译时用某种断言检查它吗?或者它是我必须在运行时声明的东西?
我期待着一种方法,我可以在没有隐式/显式转换,循环,切换,内置函数,宏的情况下找到字节序.我尝试过代码,但它使用显式转换.
int is_little_endian(){
int temp = 1;
return *(char *) temp;//Returns 1 if it's a little endian machine.
}
Run Code Online (Sandbox Code Playgroud)
[编辑]
它必须在不使用任何铸件的情况下完成.我找不到一个问题,我们可以在不投射和使用宏的情况下完成它.此处的隐式转换是指编译器自动转换.从char到int说.
c++ ×7
endianness ×5
c ×4
32bit-64bit ×1
algorithm ×1
architecture ×1
c++11 ×1
compile-time ×1
file ×1
file-io ×1
macros ×1
stream ×1
type-punning ×1
unions ×1