为什么转换为 extFloat80_t 总是 return 0?

Why does conversion to extFloat80_t always return 0?

我已经构建了我认为是 SoftFloat 库 (http://www.jhauser.us/arithmetic/SoftFloat.html) 提供的 extFloat80_t 类型最简单的用法,但看不出我做错了什么 - - 我尝试过的 i32 的所有值都会导致输出“0”。

#include "softfloat.h"
#include "stdio.h"
int main( int argc, char** argv )
{
    int32_t i32 = 1000;
    extFloat80_t f80 = i32_to_extF80(i32);
    int32_t i80 = extF80_to_i32_r_minMag( f80, false );
    printf( "%d\n", i80 );
    return 0;
}

构建于

gcc -I source/include/ test.c -DSOFTFLOAT_FAST_INT64 build/Linux-x86_64-GCC/softfloat.a -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16   -DSOFTFLOAT_FAST_DIV64TO32

我已在 Ubuntu/x86_64(版本 16.04)上重现了您的结果。 (您尚未指定目标的确切细节。请在以后的问题中提供此类关键数据。)

我已经通过添加

修复了它
#define LITTLEENDIAN 1

到主程序定义。在此之后,所有值都被正确恢复。

我想这与 Linux 中使用的 x86_64 SysV ABI 有关 - 它允许将按值传递的结构拆分为几个寄存器(而不是按指针传递),并错误定义字节序导致不正确的拆分。如果没有所需的定义,extFloat80_t 中的 signExpsignif 的顺序会颠倒。