浮点的终止性 在C++中使用二进制代码(:ST::iO::二进制< /代码>),使用 STD::FSturt——这包括整数和浮点值。虽然我的代码在我自己的体系结构上工作,但我不想确保它是可移植的,也就是说,在我的机器上编写的二进制文件仍然可以被具有不同端的机器正确读取。所以我的想法是,我将在二进制文件的第一个字节添加一个值,该值将指示文件的结尾
由于无法保证整数和浮点的endianness是相同的,因此我需要分别获取这两种数据类型的信息。虽然使用指针算法获取整数的endianess相当简单,但我不知道如何在运行时获取float的endianess。有什么想法吗 我的代码如下所示:浮点的终止性 在C++中使用二进制代码(:ST::iO::二进制< /代码>),使用 STD::FSturt——这包括整数和浮点值。虽然我的代码在我自己的体系结构上工作,但我不想确保它是可移植的,也就是说,在我的机器上编写的二进制文件仍然可以被具有不同端的机器正确读取。所以我的想法是,我将在二进制文件的第一个字节添加一个值,该值将指示文件的结尾,c++,floating-point,fstream,endianness,C++,Floating Point,Fstream,Endianness,由于无法保证整数和浮点的endianness是相同的,因此我需要分别获取这两种数据类型的信息。虽然使用指针算法获取整数的endianess相当简单,但我不知道如何在运行时获取float的endianess。有什么想法吗 我的代码如下所示: #include <cstdint> #define INT_LITTLE_ENDIAN 0x01u #define INT_BIG_ENDIAN 0x02u #define FLOAT_LITTLE_ENDIAN 0x
#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;
}
#包括
#定义INT_LITTLE_ENDIAN 0x01u
#定义INT\u BIG\u ENDIAN 0x02u
#定义浮点值\u LITTLE\u ENDIAN 0x04u
#定义浮点\大\尾数0x08u
uint8_t getEndianess(){
uint8_t endianess=0x00;
uint16_t integerNumber=0x1;
uint8_t*numPtr=(uint8_t*)和整数编号;
if(numPtr[0]==1){
endianess |=INT_LITTLE_ENDIAN;
}否则{
endianess |=INT_BIG_ENDIAN;
}
/*TODO:检查浮动的Endianness*/
回归耐性;
}
如果我们假设浮点数的最高位是符号(如IEEE),而它们不是,例如,二的补码,那么您可以轻松地生成一个数字,对其求反,并检查第一个或最后一个字节是否更改 嗯,除了endianness之外,您还可以使用非IEEE-754格式,但这是公认的罕见
如果您可以假设IEEE-754二进制,那么它几乎肯定使用与整数相同的endianness,但是您可以通过使用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;
}