zoukankan      html  css  js  c++  java
  • (int&)a和(int)a的区别

    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

    http://blog.csdn.net/mobidogs/article/details/1530775


  • 相关阅读:
    aws AWS CloudHSM
    aws Web server log analysis
    Monitor and Respond with AWS Config
    Amazon Cognito
    Amazon GuardDuty
    使用Reflactor反编译.Net程序的经验
    Windows Server 2008 25条常见问题
    解决C#读取EXCEL中数字无法读取的方法
    关于HOOK基础知识(windows API ,C++)
    Windows下Hook API 技术(HOOK SEND)
  • 原文地址:https://www.cnblogs.com/yyf573462811/p/6365347.html
Copyright © 2011-2022 走看看