• 面试题——类型转换


    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。

  • 相关阅读:
    几种归一化方法的概念及python实现
    python 中几种基本的矩阵操作应用
    exec 命令简单用法 和 find 搭配用法示例
    使用git在github上创建新工程
    gcc编译参数详解概述
    此心不明,能有何为
    多个文件目录下Makefile的写法
    《高效能程序员的修炼》读后思考之写作的重要性
    音频格式RAW和PCM区别和联系
    SWIG 基本概念和入门
  • 原文地址:https://www.cnblogs.com/jacen789/p/7909572.html
Copyright © 2020-2023  润新知