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。