Chinaunix首页 | 论坛 | 博客
  • 博客访问: 988579
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

2012年(158)

我的朋友

分类: C/C++

2012-11-15 11:00:52

先看一个普通的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++程序员都应该知道,在此不罗嗦。
阅读(1671) | 评论(8) | 转发(0) |
给主人留下些什么吧!~~

网友评论2012-11-15 11:02:21

Bill David
Ping Back来自:blog.csdn.net
Bill David引用了该文章,地址:http://blog.csdn.net/billdavid/archive/2004/11/26/195006.aspx

网友评论2012-11-15 11:01:59

周星星
谢谢你的回复,union确实可以,而且union也应该是最正宗的方法,但我是个懒人,即使少打一个字我也觉得赚了,哈哈,所以忘了将union这种方法写出来。
但 union 在C++中也有她的局限性,比如union中的成员不能有拷贝构造函数等,这使得union在C++中做这类转化不能通用。

网友评论2012-11-15 11:01:41

Jeex
用联合也可以吧
union {
int i;
float f;
}