-------------------------------------------------------------------
经典问题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.
经典问题4:c/c++ 程序设计 ---float类型转换问题
最新推荐文章于 2024-03-04 22:29:36 发布