C++ 将MIPS代码移植到x86_64时的浮点差异

C++ 将MIPS代码移植到x86_64时的浮点差异,c++,gcc,double,mips,C++,Gcc,Double,Mips,我目前正在将一段使用MIPSPro为SGI编写和编译的代码移植到带有GCC4.4.7的RHEL6.7。我的目标体系结构是x86_64。我能够为这段代码生成一个可执行文件,现在我正在尝试运行它 我试图从一个文件中读取二进制数据,这个文件是在SGI系统中生成的,基本上是通过将对象指针转换为char*并将其保存到一个文件中。我试图读取的二进制数据或多或少有以下格式: [ Header, Object A , Object B, ..., Object N ] 其中每个对象都是不同类的实例化 代码当前

我目前正在将一段使用MIPSPro为SGI编写和编译的代码移植到带有GCC4.4.7的RHEL6.7。我的目标体系结构是x86_64。我能够为这段代码生成一个可执行文件,现在我正在尝试运行它

我试图从一个文件中读取二进制数据,这个文件是在SGI系统中生成的,基本上是通过将对象指针转换为
char*
并将其保存到一个文件中。我试图读取的二进制数据或多或少有以下格式:

[ Header, Object A , Object B, ..., Object N ]
其中每个对象都是不同类的实例化

代码当前处理文件的方式是将其全部读入内存,并将指针指向对象的起始位置,然后使用
reinterpret\u class(pointer)
对其进行重新解释。有些东西告诉我,最初设计这个的人并不关心可移植性

到目前为止,我能够通过交换字节来处理Header对象的endianness。不幸的是,对象A、B、…、N都包含类型为
double
的字段,并且尝试对8个字节进行字节交换似乎不起作用

那么我的问题是,SGI/MIPSPro中的double结构是否与Linux中的不同?我知道SGI机器中的
sizeof(double)
返回
8
,因此我认为它们的大小相同。

根据:

MIPS处理器符合IEEE 754浮点标准

您的目标平台

因此,
double
表示两个平台上的IEEE-754双精度浮点

当谈到endian时,x86_64处理器是小endian;但是,据介绍,一些MIPSPro处理器是big-endian处理器:

对于R4000和更早版本的系统,字节顺序可配置为大端字节顺序或小端字节顺序(配置发生在硬件重置期间)。当配置为big-endian系统时,字节0始终是最重要(最左边)的字节。当配置为小端系统时,字节0始终是最低有效位(最右边的字节)

目前,R8000 CPU仅支持big-endian

因此,您必须检查原始平台的数据表,看看是否需要任何字节交换。

根据:

MIPS处理器符合IEEE 754浮点标准

您的目标平台

因此,
double
表示两个平台上的IEEE-754双精度浮点

当谈到endian时,x86_64处理器是小endian;但是,据介绍,一些MIPSPro处理器是big-endian处理器:

对于R4000和更早版本的系统,字节顺序可配置为大端字节顺序或小端字节顺序(配置发生在硬件重置期间)。当配置为big-endian系统时,字节0始终是最重要(最左边)的字节。当配置为小端系统时,字节0始终是最低有效位(最右边的字节)

目前,R8000 CPU仅支持big-endian



因此,您必须检查原始平台的数据表,看看是否需要任何字节交换。

Linux不是处理器/体系结构。你的目标平台是什么?我的目标架构是x86_64@tadman:你的新标题完全改变了意思。这个问题与结构无关。@LightnessRacesinOrbit原来的标题就更没有意义了。“这是迈向凝聚力的婴儿步。@塔德曼:现在好多了。Linux不是处理器/体系结构。你的目标平台是什么?我的目标架构是x86_64@tadman:你的新标题完全改变了意思。这个问题与结构无关。@LightnessRacesinOrbit原来的标题就更没有意义了。塔德曼:现在好多了。所以从理论上讲,通过8字节的尾数交换,它应该能工作吗?@roscoe:据我所知。您可以测试它;)我做了,不幸的是我还是得到了奇怪的结果。看起来它读取这些对象到内存中的方式是不对的,我看不出还有什么会导致这个问题。我可能在这里离题了,但你们知道枚举在这两种体系结构中是如何格式化的吗?我应该问一个关于枚举格式的新问题,还是更新我的问题以包括这一点?@roscoe:enum不是计算机体系结构的一个因素。枚举的值只是一个整数。考虑到类型宽度和尾数,你应该会很好(虽然是的,你必须小心对齐-宁愿选择
std::copy
而不是
reinterpret_cast
),所以从理论上讲,通过进行8字节尾数交换,它应该可以工作?@roscoe:据我所知。您可以测试它;)我做了,不幸的是我还是得到了奇怪的结果。看起来它读取这些对象到内存中的方式是不对的,我看不出还有什么会导致这个问题。我可能在这里离题了,但你们知道枚举在这两种体系结构中是如何格式化的吗?我应该问一个关于枚举格式的新问题,还是更新我的问题以包括这一点?@roscoe:enum不是计算机体系结构的一个因素。枚举的值只是一个整数。考虑到字体的宽度和尾端,你应该很好(虽然是的,你必须小心对齐-宁愿选择
std::copy
而不是
reinterpret\u cast