float a = 1.0f;
cout << (int)a << endl;
cout << (int&)a << endl;
cout << boolalpha << ( (int)a == (int&)a ) << endl; // (1)输出什么?
float b = 0.0f;
cout << (int)b << endl;
cout << (int&)b << endl;
cout << boolalpha << ( (int)b == (int&)b ) << endl;// (2)输出什么?
输出结果是:
1
1065353216
false
0
0
true
答:(1)(2)分别输出false和true。注意转换的应用。(int)a实际上是以浮点数a为参数构造了一个整型数,该整数的值是1,(int&)a则是告诉编译器将a当作整数看(并没有做任何实质上的转换)。因为1以整数形式存放和以浮点形式存放其内存数据是不一样的,因此两者不等。对b的两种转换意义同上,但是0的整数形式和浮点形式其内存数据是一样的,因此在这种特殊情形下,两者相等(仅仅在数值意义上)。
注意,程序的输出会显示(int&)a=1065353216,这个值是怎么来的呢?前面已经说了,1以浮点数形式存放在内存中,按ieee754规定,其内容为0x0000803F(已考虑字节反序)。这也就是a这个变量所占据的内存单元的值。当(int&)a出现时,它相当于告诉它的上下文:“把这块地址当做整数看待!不要管它原来是什么。”这样,内容0x0000803F按整数解释,其值正好就是1065353216(十进制数)。
通过查看汇编代码可以证实“(int)a相当于重新构造了一个值等于a的整型数”之说,而(int&)的作用则仅仅是表达了一个类型信息,意义在于为cout<<及==选择正确的重载版本。
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
int main()
{
float a = 1.0f;
cout << (int)a << endl;
cout << (int&)a << endl;
cout << boolalpha << ( (int)a == (int&)a ) << endl; // 输出什么?
float b = 0.0f;
cout << (int)b << endl;
cout << (int&)b << endl;
cout << boolalpha << ( (int)b == (int&)b ) << endl; // 输出什么?
}
(int&)a == static_cast <int&>(a)
(int)&a == reinterpret_cast <int>(&a);
(int&)a 不经过转换, 直接得到a在内存单元的值,并将其转换成整数输出。
(int)a a在内存中的值转换成int类型
float类型在内存中存储的形式是 ,符号位 指数 尾数
由754标准:阶码采用增码(该数补码的反符号),尾数采用原码
所以1.0f 在内存中的形式为
0011 1111 1000 0000 0000 0000 0000 0000
所以输出的是 0x3f800000
0 在内存中的的存储形式
0000 0000 0000 0000 0000 0000 0000 0000
所以输出的是0x00000000
所以前面一个是false,后面一个是true。
http://blog.csdn.net/lvbinandylau/archive/2009/06/25/4298766.aspx
相关推荐
(int)a:与(int&)a的不同,到底如何的?
cpp代码-函数返回值:值传递 指针传递 引用传递 (返回值 返回指针 返回引用) int Fun(int a); int *Fun(int a); int &Fun(int a); (别名)
int *ptr = (int *)(&a + 1); cout *(a+1) ; cout *(ptr - 1) ; 15. 什么是智能指针? 16. Please write out the program output. #include #include #define LOOP 1000 int main(int argc, char* argv[]){ ...
(1)试编写求a中的最大值、最小值和平均值的函数void aMAX_MIN_AVE(int *a, int n, int &max;, int &min;, int &aver;), 用“引用参数”带回结果。 (2)试编写函数 int prime_SUM(int *a, int n) 计算a中所有...
const int *a int * const a 区别 外加实例
int triangleJudge(int a,int b,int c)判断三角型的类型,只是一个简单的实例。
const int a; //a是个整型常量 int const a; //同上 const int *a; //a是一个指向整型常量的指针(整型常量不可修改,但指针a可以) int * const a; //a是一个指向整型数的常量指针(整型常量可修改,但指针a不...
void godown(int &m,int &a) { for(temp=1;temp;temp++) if(array[temp][a]==0) array[temp][a]=m++; a++; } void goright(int &m,int &b) { for(temp=1;temp;temp++) if(array[b][temp]==0) array[b]...
分别编写三个函数int aMAX(int *a,int n) 、 int aMIN(int *a,int n) 、 int aAVE(int *a,int n) 实现求最大值、最小值和平均值。 用一个函数void aMAX_MIN_AVE(int *a, int n, int &max, int &min, int &aver...
这里我们先看看数组名代表的是什么,这个概念可能大家有所误解,认为数组名代表的就是数组的地址,当然,数组名代表的是一个地址,但是关键是,通过这个地址,我们关注的是它能... 这里我们以整形数组为讲解:int a[4];
int a=1; int &b=a;//b是a的一个变量,初始化为a 声明一个变量时必须对其进行初始化。 声明一个变量的引用后,在函数执行期间,该引用会一直与其代表的变量联系,该引用名不能作为其他变量的别名。 如何区别&是...
void godown(int &m,int &a) { for(temp=1;temp;temp++) if(array[temp][a]==0) array[temp][a]=m++; a++; } void goright(int &m,int &b) { for(temp=1;temp;temp++) if(array[b ][temp]==0) array[b ]...
比如 一个函数 chat(link &a);...要注意int&和int*是两个完全不同的类型。int&是引用类型,而int*是指向int类型变量的指针类型。 void chat(int&a) { a=20; } 调用此函数: int x=100; chat(x); // 此时x的值变为
void swapValue1(int &a, int &b) //使用中间变量交换数据 { int temp = a; a = b; b = temp; } void swapValue2(int &a, int &b)//使用加减运算完成数据交换 { a = a + b; b = a - b; a = a - b; } void swap...
int GetYS(int a) { int i,sum=0; for(i=1;i<=a;i++) if(a%i==0) sum++; return sum; } void Swap(int &a,int &b) { int temp; temp=a; a=b; b=temp; } int Result(int a,int b) { int i,result,max=0; ...
三级C语言题目第二期(里面附有第一期答案),请大家认真完成。
OMAP-L138的新历程之ARM裸机中断AINTC。omapl138 arm处理机执行中断的流程: 1.首先就是知道ARM状态下的通用寄存器和程序计数器,绿颜色的就是相应模式下的私有寄存器。就是说程序一般运行在系统和用户模式下,使用...
void do(int X,int A,int B) { if((A>1)&&(B=0)) X=X/A; if((A=2)||(X>1)) X=X+1; } a) 画出程序的控制流图。 b) 计算程序的环形复杂度(导出程序基本路径集中的独立路径条数这是确定程序中每个可执行语句至少执行...