经典问题4:c/c++ 程序设计 ---float类型转换问题

-------------------------------------------------------------------
经典问题4:c/c++ 程序设计 ---类型转换问题
-------------------------------------------------------------------
   面试题:下面程序的结果是多少?(2009-07-26)
     1    #include <iostream>
     2    #include <stdio.h>
     3    #include <string.h>
     4     
     5    using namespace std;
     6     
     7    int main()
     8    {
     9        float a = 1.0f;
    10        cout<<&a<<endl;
    11        cout<<(int)&a<<endl;/*(int)&a:把a的地址强制转换成整型*/
    12        cout<<(int&)a<<endl; 
 /*
  *(int&)a:将a的引用强制转换为整型,意思是a所在的内存,本来定义的时
  *候为float类型,并初始为1.0f,但现在我要按int类型解释这段内存。
  *1.0f 在内存中的存储为 0011 1111 1000 0000 0000 0000 0000 0000.
  *把他按整型数解释为2^29+2^28+2^27+2^26+2^25+2^24+2^23=1065353216
  */
    17        cout<< boolalpha<<((int)a ==(int&)a)<<endl;
 // 输出false.因为1 !=1065353216.
    18        float b = 0.0f;
    19        cout<< (int)b << endl;
    20        cout<< (int&)b << endl;
    21      cout<<boolalpha <<((int)b == (int&)b ) << endl;
// 输出true,因为0==0;
    22        return 0;
    23    }
----------------
$ ./a.out
0xbfbf38c0
-1077987136
1065353216
0
0
0
1
------------------
知识点:
--(1)
浮点数的 1.0f 在内存里是这样表示的:
0011 1111 1000 0000 00000000 00000000
这个32位二进制数被当作整数输出就是:
1065353216
而整数的 1 在内存里是这样表示的:
0000 0000 0000 0000 00000000 00000001

所以 (int)a != (int&)a

浮点的0和整数的0 在内存里都是:
0000 0000 0000 0000 00000000 00000000

所以 (int)b == (int&)b
--(2)(int &)a 与(int)a
(int &)a 就表示 不管 a 是什么,我都当他是一个int变量。
从机器码的角度来说,变量a会被翻译成一个内存地址,(int &)a 就是说,这个内存地址里的内容它是一个整数。

(int)a与之不同:如果 a 不是整数,就会按规则转换成整数,存入另一个地址(或临时变量)中去。

--(3)浮点数内存表示
目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算。这种结构是一种科学计数法,
用符号、指数和尾数(最高位的1不写入内存)来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号。下面是具体的规格:
      符号位 阶码 尾数 长度
float   1      8    23   32
double  1     11   52   64

举例:-12.5转为单精度二进制表示

12.5:
1. 整数部分12,二进制为1100; 小数部分0.5, 二进制是.1,先把他们连起来,从第一个1数起取24位(后面补0):
1100.10000000000000000000
这部分是有效数字。(把小数点前后两部分连起来再取掉头前的1,就是尾数)
2. 把小数点移到第一个1的后面,需要左移3位(1.10010000000000000000000*2^3), 加上偏移量127:127+3=130,二进制是10000010,这是阶码。
3. -12.5是负数,所以符号位是1。把符号位,阶码和尾数连起来。注意,尾数的第一位总是1,所以规定不存这一位的1,只取后23位:
1 10000010 10010000000000000000000
把这32位按8位一节整理一下,得:
11000001 01001000 00000000 00000000
就是十六进制的 C1480000.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值