浮点转换--笔试题的思考?

铭毅天下
大数据领域优质创作者
博客专家认证
2012-08-27 06:56:42
/*---------------浮点转换---------------------------------*/

int main()
{
float a = 1.0f;
cout << (int)a << endl;
cout << &a << endl;
cout << (int&)a << endl;
cout << boolalpha << ( (int)a == (int&)a ) << endl;

float b = 0.0f;
cout << (int)b << endl;
cout << &b << endl;
cout << (int&)b << endl;
cout << boolalpha << ( (int)b == (int&)b ) << endl;
return 0;
}

问题1:(int&)a中(int&)的确切含义是什么?
我知道的答案是:浮点数的内存和整数的存储方式不同;int(&a) 相当于该浮点地址开始的sizeof(int)个字节当成int型的数据输出,这取决于float型数据在内存中的存储方式,而不是经过int(&a)显示转换的结果1。
能不能再详细介绍一下?
...全文
167 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yisikaipu 2012-08-27
  • 打赏
  • 举报
回复
不管什么平台,现在所用的浮点一般都是IEEE标准,float 1.0f;的表示都一样,无非有大端小端之分,但这又不是重点
yisikaipu 2012-08-27
  • 打赏
  • 举报
回复
楼上,我实在不知道哪个编译器能在编译阶段就完成这种如下转换而不是把浮点例程塞到代码里

int main()
{
float f,g;

// read f and g from somewhere

float a=f*g;
int i=(int)a;
}
BYD123 2012-08-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

浮点1的内存:3f 80 00 00
整数1的内存:00 00 00 01

(int)a相当于调用了一个函数,convert_from_float_to_int(a)
(int&)a相当于 *((int*)&a),即得到0x3f800000
[/Quote]
1)No。类型转换般是由编译器来完成,不会出现 1.0转换成整型后还是1,不会是别的,除非浮点数本身或者整型溢出。
2)分清在不同平台下,编译器的细小差别是很重要的,否则不要使用自己不能预料的编译器行为。
yisikaipu 2012-08-27
  • 打赏
  • 举报
回复
vs2008 release /Od
     1: // 
2: //
3:
4: #include "stdafx.h"
5: using namespace std;
6:
7: int main()
8: {
push ebp
mov ebp,esp
sub esp,0Ch
9: float a=1.0f;
fld1
fstp dword ptr [a]
10: int i=(int)a;
fld dword ptr [a]
call _ftol2_sse (401820h)
mov dword ptr [i],eax
11: int &j=(int&)a;
lea eax,[a]
mov dword ptr [j],eax
12: }
xor eax,eax
mov esp,ebp
pop ebp
ret


这里的_ftol2_sse就是前面说的convert_from_float_to_int()
yisikaipu 2012-08-27
  • 打赏
  • 举报
回复
而0的浮点表示和整数表示是一样的,内存都是:00 00 00 00
yisikaipu 2012-08-27
  • 打赏
  • 举报
回复
浮点1的内存:3f 80 00 00
整数1的内存:00 00 00 01

(int)a相当于调用了一个函数,convert_from_float_to_int(a)
(int&)a相当于 *((int*)&a),即得到0x3f800000
liaoqi127 2012-08-27
  • 打赏
  • 举报
回复
float型内存中的存储方式和int很不一样,1.0f在内存里不是....0000001,而(int&)a把a的内存前部分截取强制转化为int型(这和(int)a是不一样的)。所以你看到了很奇怪的现象

64,266

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧