zoukankan      html  css  js  c++  java
  • 面试题——类型转换

    1、下面程序的结果是什么?

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 int main()
     6 {
     7     float a=1.0f;
     8     cout<<(int)a<<endl;
     9     cout<<&a<<endl;
    10     cout<<(int&)a<<endl;
    11     cout<<boolalpha<<((int)a==(int&)a)<<endl;
    12 
    13     float b=0.0f;
    14     cout<<(int)b<<endl;
    15     cout<<&b<<endl;
    16     cout<<(int&)b<<endl;
    17     cout<<boolalpha<<((int)b==(int&)b)<<endl;
    18 
    19     return 0;
    20 }

    分析:

    (int&)a的结果是1065353216,而不是1。

    这是因为浮点数在内存里和整数的存储方式不同,(int&)a相当于将该浮点数地址开始的sizeof(int)个字节当成int型的数据输出,
    因此这取决于float型数据在内存中的存储方式,而不是经过(int&)a显示转换的结果(1)。

    因为float a=1.0f 在内存中的表示都是3f800000,而浮点数和一般整型不一样,所以当(int&)a强制转换时,会把内存值3f800000当成int型输出,
    所以结果自然变为了1065353216(0x3f800000的十进制表示)。

    2、下面程序的结果是多少?

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 int main()
     6 {
     7     unsigned int a = 0xFFFFFFF7;
     8     unsigned char i = (unsigned char)a;
     9     char *b = (char*)&a;
    10 
    11     printf("%08x, %08x", i, *b);
    12 
    13     return 0;
    14 }

    分析:

    在X86系列的机器中,数据的存储是“小端存储”。

    unsigned char i = (unsigned char)a;  // unsigned int到unsigned char直接截断,取低字节为0xf7。输出时因为i是unsigned char,保证值不变,按0扩展成unsigned int为0x000000f7。

    char *b = (char*)&a;  // 这里的b指向的也是是0xf7这个数据。但是*b是一个char类型的数,输出时保证值不变,那么*b将会被隐式自动类型转换成0xfffffff7,这时不需要填充0。

  • 相关阅读:
    持久层框架:MyBatis 3.2(2)
    持久层框架:MyBatis 3.2(1)
    循环结构(二)
    Android LayoutInflater详解
    为什么调用 FragmentPagerAdapter.notifyDataSetChanged() 并不能更新其 Fragment?
    Android Support v4、v7、v13的区别和应用场景
    Android的string-array数据源简单使用
    FragmentTabHost切换Fragment时避免重复加载UI
    Ubuntu 安装Chrome步骤
    慢慢来,让好习惯自然来
  • 原文地址:https://www.cnblogs.com/jacen789/p/7909572.html
Copyright © 2011-2022 走看看