面试题——类型转换

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。

原文地址:https://www.cnblogs.com/jacen789/p/7909572.html