这是一个基本问题,我的答案是肯定的(int = 32位,double = 53位螳螂+符号位)。
基本上可以断言?
int x = get_random_int();
double dx = x;
int x1 = (int) dx;
assert(x1 ==x);
if (INT_MAX-10>x)
{
dx+=10;
int x2=(int) dx;
assert(x+10 == x2);
}
Run Code Online (Sandbox Code Playgroud)
显然,涉及带有除法和类似内容的复杂表达式的内容((int)(5.0 / 3 * 3)与5/3 * 3是不同的),但我想知道转换和加减运算是否有效(如果没有溢出发生)保持等价。
如果尾数的位数大于等于整数的位数,则答案为是。在您的问题中,您给出的特定大小int和的尾数double,但是知道2003 C ++标准不能保证这是很有用的,该标准没有提及int和double的尾数的相对大小。
请注意,使用IEEE 754浮点算法不需要C和C ++。根据2003 C ++标准的3.8.1 / 8,
浮点类型的值表示形式是实现定义的。
实际上,C ++允许甚至不使用二进制尾数的浮点表示形式。对于C,#include <limits.h>可用于推断有关基本类型的信息。特别是,如果FLT_RADIX提高到幂DBL_MANT_DIG大于或等于INT_MAX,则int可以精确表示所有值。在C ++中,相应的数量被命名numeric_limits<double>::radix,numeric_limits<double>::digits和numeric_limits<int>::max()。
给定两个整数操作数和一个始终从整数操作数生成整数的操作(例如+或*,但不是/),所有IEEE 754舍入模式将精确地生成一个整数。如果此整数可以用表示int(因此可以精确地用表示,则double假设我们的尾数至少等于int),那么它将与使用相应的整数运算所获得的整数相同。即使不符合IEEE 754标准,任何明智的FP实现都将保留上述保证。