考虑下面的C++程序并预测输出。
#include
using namespace std;
int main()
{
float f = 0xffffffff;
unsigned int x = 0xffffffff; // Value 4294967295
if (f == x)
cout << "true";
else
cout << "false";
return 0;
}
如果编译器使用“ IEEE754 32位单浮点类型”,则上述程序的输出为false。如果我们定义:
float f = 0xffffffff;
我们基本上是在尝试为32位浮点数分配32位整数(有符号或无符号)。编译器首先将整数0xffffffff转换为最接近的32位浮点数,并且浮点数f的内存表示形式与整数0xffffffff不同。通过打印f和x可以看到上述值。
#include
using namespace std;
int main()
{
float f = 0xffffffff;
unsigned int x = 0xffffffff;
cout << "f = " << f << endl;
cout << "x = " << x << endl;
return 0;
}
输出 :
f = 4.29497e+09
x = 4294967295
例如,即使我们直接复制内存,我们也有一个整数(值等于0xffffffff),然后复制内容(内存值)。由于IEEE754中的0xffffffff不是有效的浮点数,因此,如果将此无效表示形式与其自身进行比较,则它是不相等的。
unsigned int x = 0xffffffff;
memoryCopy(&f, &x, sizeof(x));
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程” 。