先看一个普通的float到int的转化:
float a =
1.0f;
int b = (int)a; //
BTW:(int)a是强制类型转化,而int(a)是根据float构造整型对象
cout << b; //
输出 1
这是将浮点类型转化为整型,但如果想将浮点类型的存储转化为整型的存储怎么办?C语言中唯一的方法是 :
float a =
1.0f;
int b = *(int*)&a;
cout << hex << b <<
endl; // 输出 3F800000
*(int*)&a = 0x3F900000; //
看看int类型的3F900000作为浮点数是多少
cout << a << endl; // 输出
1.125
可以看出 int的3F800000 和 float的1.0 在内存中的存储是一样的,int的3F900000 和 float的1.125
在内存中的存储是一样的。这个转化使用了一个技巧,强制转化的其实是指针。
比较在C++中的方法:
float a = 1.0f;
int
b = (int&)a;
cout << hex << b << endl; // 输出
3F800000
(int&)a = 0x3F900000;
cout << a << endl;
// 输出
1.125
哇,非常直观,写起来也非常简洁。
但立即数可不可以做这种强制类型转化呢?理论上是可以的,但实际的测试结果却是不行:
cout
<< (const int&)1.0f << endl; // 输出 1
cout <<
(const int&)float(1.0f) << endl; // 输出 1
想想之所以这样也是可以理解的,
毕竟立即数在编码时就确定了,没有运行时计算的必要。
顺便在这里回答一个看起来与主题相关,但其实没任何联系的问题:
Q:
*((UINT32*&)pbCode)++ = nValue; 中 & 的作用?
A:
C语言中的强制类型转化之后的值应该是常量(const)值,无法作为左值(l-value),所以也就无法调用 operator++(int)
等操作,而C++中的引用(reference)则不同,这个不同每一个C++程序员都应该知道,在此不罗嗦。
阅读(1670) | 评论(8) | 转发(0) |