浮点字节顺序
Endianness for floating point
我正在使用 std::fstream
在 C++ 中写入和读取二进制数据 (std::ios::binary
) - 这包括整数和浮点值。虽然我的代码适用于我自己的体系结构,但我不想确保它是可移植的,即在我的机器上编写的二进制文件仍应在具有不同字节序的机器上正确读取。所以我的想法是我将在二进制文件的第一个字节处添加一个值,该值将指示文件的字节顺序。
由于无法保证整数和浮点数的字节顺序相同,我需要分别获取这两种数据类型的信息。虽然使用指针算法获得整数的字节序相当简单,但我不知道如何在运行时获得浮点数的字节序。有什么想法吗?
我的代码如下:
#include <cstdint>
#define INT_LITTLE_ENDIAN 0x01u
#define INT_BIG_ENDIAN 0x02u
#define FLOAT_LITTLE_ENDIAN 0x04u
#define FLOAT_BIG_ENDIAN 0x08u
uint8_t getEndianess(){
uint8_t endianess = 0x00;
uint16_t integerNumber = 0x1;
uint8_t *numPtr = (uint8_t*)&integerNumber;
if (numPtr[0] == 1) {
endianess |= INT_LITTLE_ENDIAN;
}else {
endianess |= INT_BIG_ENDIAN;
}
/* TODO: check endianess for float */
return endianess;
}
如果我们假设浮点数的最高位是符号(如 IEEE),而它们不是,例如,如二进制补码,您可以轻松地生成一个数字,将其取反并检查第一个字节还是最后一个字节变了。
好吧,除了字节序之外,您还可以使用非 IEEE-754 格式,但不可否认,这种情况很少见。
如果您可以假定 IEEE-754 二进制,那么它几乎肯定使用与整数相同的字节顺序,但您可以使用浮点值轻松检查,该值是 2 的负幂(例如 -1.0),它将有一个非零 MSbyte(包含符号和指数的一部分)和一个零 LSbyte(包含最低有效尾数位)。
float floatNumber = -1.0;
uint8_t *numPtr = (uint8_t*)&floatNumber;
if (numPtr[0] == 0) {
endianess |= FLOAT_LITTLE_ENDIAN;
} else {
endianess |= FLOAT_BIG_ENDIAN;
}
我正在使用 std::fstream
在 C++ 中写入和读取二进制数据 (std::ios::binary
) - 这包括整数和浮点值。虽然我的代码适用于我自己的体系结构,但我不想确保它是可移植的,即在我的机器上编写的二进制文件仍应在具有不同字节序的机器上正确读取。所以我的想法是我将在二进制文件的第一个字节处添加一个值,该值将指示文件的字节顺序。
由于无法保证整数和浮点数的字节顺序相同,我需要分别获取这两种数据类型的信息。虽然使用指针算法获得整数的字节序相当简单,但我不知道如何在运行时获得浮点数的字节序。有什么想法吗?
我的代码如下:
#include <cstdint>
#define INT_LITTLE_ENDIAN 0x01u
#define INT_BIG_ENDIAN 0x02u
#define FLOAT_LITTLE_ENDIAN 0x04u
#define FLOAT_BIG_ENDIAN 0x08u
uint8_t getEndianess(){
uint8_t endianess = 0x00;
uint16_t integerNumber = 0x1;
uint8_t *numPtr = (uint8_t*)&integerNumber;
if (numPtr[0] == 1) {
endianess |= INT_LITTLE_ENDIAN;
}else {
endianess |= INT_BIG_ENDIAN;
}
/* TODO: check endianess for float */
return endianess;
}
如果我们假设浮点数的最高位是符号(如 IEEE),而它们不是,例如,如二进制补码,您可以轻松地生成一个数字,将其取反并检查第一个字节还是最后一个字节变了。
好吧,除了字节序之外,您还可以使用非 IEEE-754 格式,但不可否认,这种情况很少见。
如果您可以假定 IEEE-754 二进制,那么它几乎肯定使用与整数相同的字节顺序,但您可以使用浮点值轻松检查,该值是 2 的负幂(例如 -1.0),它将有一个非零 MSbyte(包含符号和指数的一部分)和一个零 LSbyte(包含最低有效尾数位)。
float floatNumber = -1.0;
uint8_t *numPtr = (uint8_t*)&floatNumber;
if (numPtr[0] == 0) {
endianess |= FLOAT_LITTLE_ENDIAN;
} else {
endianess |= FLOAT_BIG_ENDIAN;
}