代码之家  ›  专栏  ›  技术社区  ›  yesraaj

在场景后面进行双整型转换?

  •  12
  • yesraaj  · 技术社区  · 14 年前

    我只是想知道在场景后面发生了什么,将double转换成int,比如int(5666.1)?这是否比将子类静态强制转换为父类的成本更高?由于int和double的表示方式有本质上的不同,在这个过程中是否会有临时性的创建,而且成本也很高。

    3 回复  |  直到 8 年前
        1
  •  18
  •   Potatoswatter R. Martinho Fernandes    8 年前

    任何具有本机浮点的CPU都将有一个将浮点数据转换为整数数据的指令。这个操作可以从几个周期到许多周期。通常,fp和整数有单独的CPU寄存器,因此在使用之前,您还必须随后将整数移到整数寄存器。那可能是另一个手术,可能很贵。请参阅处理器手册。

    PowerPC明显不包括将fp寄存器中的整数移到整数寄存器的指令。必须有一个从fp到memory和load到integer的存储。因此,可以说创建了一个临时变量。

    如果没有硬件FP支持,则必须对数字进行解码。IEEE FP格式为:

    sign | exponent + bias | mantissa
    

    要转换,你必须做一些像

    // Single-precision format values:
    int const mantissa_bits = 23; // 52 for double.
    int const exponent_bits = 8; // 11 for double.
    int const exponent_bias = 127; // 1023 for double.
    
    std::int32_t ieee;
    std::memcpy( & ieee, & float_value, sizeof (std::int32_t) );
    std::int32_t mantissa = ieee & (1 << mantissa_bits)-1 | 1 << mantissa_bits;
    int exponent = ( ieee >> mantissa_bits & (1 << exponent_bits)-1 )
                 - ( exponent_bias + mantissa_bits );
    if ( exponent <= -32 ) {
        mantissa = 0;
    } else if ( exponent < 0 ) {
        mantissa >>= - exponent;
    } else if ( exponent + mantissa_bits + 1 >= 32 ) {
        overflow();
    } else {
        mantissa <<= exponent;
    }
    if ( ieee < 0 ) mantissa = - mantissa;
    return mantissa;
    

    也就是说,一些开箱说明和一个班次。

        2
  •  4
  •   Hans Passant    14 年前

    如果代码生成器使用IntelSSE2指令集,那么总是有一个专用的fpu指令来完成任务,即cvttsd2si。这很快,但不如静态演员快。这通常根本不需要任何代码。

        3
  •  4
  •   brianegge    14 年前

    STATICECAST CAST依赖于编译器的C++代码生成,但通常没有运行时成本,因为指针转换是基于编译时假定的信息在编译时计算的。

    当您将double转换为int时,在x86系统上,编译器将生成一个 FIST (浮点/整数转换)指令,FPU将进行转换。这种转换可以在软件中实现,并通过这种方式在某些硬件上实现,或者如果程序需要的话。这个 GNU MPFR 库能够进行双整型转换,并将在所有硬件上执行相同的转换。