我只是想知道将 double 转换为 int 的幕后发生了什么,比如 int(5666.1) ?这会比子类对父类的 static_cast 更昂贵吗?由于 int 和 double 的表示形式根本不同,因此在此过程中会创建临时变量,而且成本也很高。
最佳答案
任何具有 native 浮点的 CPU 都有将 float 转换为整数数据的指令。该操作可能需要几个周期到多个周期。通常对于 FP 和整数有单独的 CPU 寄存器,因此您还必须随后将整数移动到整数寄存器才能使用它。这可能是另一种操作,可能很昂贵。请参阅您的处理器手册。
PowerPC 尤其不包括将 FP 寄存器中的整数移动到整数寄存器的指令。必须从 FP 存储到内存并加载到整数。因此,您可以说创建了一个临时变量。
在没有硬件 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;
即,一些解包指令和移位。
关于c++ - Double 到 int 的转换在幕后?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2189723/