Chinaunix首页 | 论坛 | 博客
  • 博客访问: 988490
  • 博文数量: 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++程序员都应该知道,在此不罗嗦。
阅读(1670) | 评论(8) | 转发(0) |
给主人留下些什么吧!~~

网友评论2012-11-15 11:03:38

周星星
m_hDIB是由哪个api得到的?无论如何,都不可能是强制类型转化。

BMP文件由四个部分组成:
文件头 BITMAPFILEHEADER
信息头 BITMAPINFOHEADER
色彩表 RGBQUAD
像素阵列

网友评论2012-11-15 11:03:23

cc
HANDLE m_hDIB;
BITMAPINFOHEADER *bmiHeader;

*bmiHeader = (BITMAPINFOHEADER *) m_hDIB;

网友评论2012-11-15 11:03:09

十年未晚
sorry,昨天昏头了---值还是不变的。
真是FT

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

十年未晚
又看了一遍,终于看懂了:)

不过我遇到另一个问题。作图像处理时灰度图像象素值img[x][y]是以uchar存储的,如果将其读到一个float的数组中,那多出来的3字节是什么内容?这样如果对图像值作计算或变换岂不完全走样了?
...
float** a;
a[x][y]= ima[x][y]
S(a);
...
之所以这么作是现要将一算法S应用于其上,而用到该算法的函数只接受float**的参数

另外这一类的转换都有这个问题。比如从unsigned int到float,虽然长度一样,但有了正负,且对数据的解读完全不一样,对于作算术运算,有没有解决的办法?

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

yjgx007
长知识了,呵呵