我目前正在将使用MIPSPro为SGI编写和编译的一段代码移植到带有gcc 4.4.7的RHEL 6.7中。我的目标体系结构是x86_64,我能够为此代码生成可执行文件,现在我正在尝试运行它。
我正在尝试从文件中读取二进制数据,该文件是在SGI系统中通过基本上将对象的指针转换为char*
并将其保存到文件中而生成的。我尝试读取的二进制数据或多或少具有以下格式:
[ Header, Object A , Object B, ..., Object N ]
每个对象是不同类的实例。
代码当前处理文件的方式是将其全部读取到内存中,然后将指针指向对象的起始位置,并使用
reinterpret_class<Class A>(pointer)
对其进行处理。某些信息告诉我,最初设计此功能的人并不关心可移植性。到目前为止,我只需要交换字节就可以处理Header对象的字节序。不幸的是,对象A,B,..,N都包含
double
类型的字段,并且尝试对8个字节进行字节交换似乎不起作用。那么我的问题是,SGI / MIPSPro中的双精度结构与Linux中的结构是否有所不同?我知道SGI机器中的
sizeof(double)
返回8
,所以我认为它们的大小相同。 最佳答案
根据the MIPSPro ABI:
MIPS处理器符合IEEE 754浮点标准
您的目标平台x86_64, shares this quality。
因此,double
表示两个平台上的IEEE-754双精度浮点数。
当涉及字节序时,x86_64处理器是低字节序的。但是,根据the MIPSpro assembly programmers' guide,某些MIPSPro处理器是大端的:
对于R4000和更早的系统,字节顺序可配置为big-endian或little-endian字节顺序(配置在硬件复位期间进行)。当配置为大端优先系统时,字节0始终是最高有效(最左侧)字节。当配置为小字节序系统时,字节0始终是最低有效(最右边的字节)。
目前,R8000 CPU仅支持big-endian
因此,您将必须检查原始平台的数据表,并查看是否需要任何字节交换。