我目前正致力于将使用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
所以我认为它们的大小相同。
答案 0 :(得分:2)
MIPS处理器符合IEEE 754浮点标准
您的目标平台x86_64, shares this quality。
因此,double
表示两个平台上的IEEE-754双精度浮点数。
当谈到字节序时,x86_64处理器是小端的;但是,根据the MIPSpro assembly programmers' guide,一些 MIPSPro处理器是big-endian:
对于R4000及更早版本的系统,字节排序可配置为big-endian或little-endian字节排序(在硬件复位期间进行配置)。当配置为big-endian系统时,字节0始终是最重要(最左边)的字节。当配置为little-endian系统时,字节0始终是最不重要的(最右边的字节)。
目前,R8000 CPU仅支持big-endian
因此,您必须检查原始平台的数据表,看看是否需要进行任何字节交换。