1、浮点数的转换
#include <iostream>
using namespace std;
int main(void)
{
float a = 1.0f;
cout<<(int)a<<endl;
cout<<&a<<endl;
cout<<hex<<(int&)a<<endl;
cout<<boolalpha<<((int)a == (int&)a)<<endl;
cout<<"----------"<<endl;
float b = 0.0f;
cout<<(int)b<<endl;
cout<<&b<<endl;
cout<<hex<<(int&)b<<endl;
cout<<boolalpha<<((int)b == (int &)b)<<endl;
return 0;
}
输出为:
1
0x7fff5fbffa9c
3f800000
false
----------
0
0x7fff5fbffa98
0
true
难点解释:浮点数转化为整数时,是取整,而化为整数引用时 (int&)a 相当于 *(int*)&a。 所以 float a=1.0f; (int)a 和 (int&)a 是不同的,1.0f在内存中是 3F800000,
3f800000H=0 01111111 00000000000000000000000B (注意我分成了三段)
符点型数据在X86机上占四个字节,其存储按IEEE754标准实现,即:
1位的符号位s 0(代表正数,1代表负数)
8位的指数位e(移码表示)01111111是0的移码
23位的小数位f 0000000000000000000000 表示小数部分为0
因此,作为int看待的话是1065353216,所以(int)a等于1,(int&)a等于1065353216。 而之所以当b=0.0f时,(int)b 和 (int&)b 相等,是因为0.0f和0的内存布局正好一致,都是 00000000。
2、sizeof(struct A);以结构体里面最长的数据元素为对齐单元,结构体的长度一定是最长的数据元素的整数倍,如果结构体内存在长度大于处理器的元素,那么就以处理器的位数为对齐单元。
3、空类的大小占一个字节
这里试图讨论为什么C++的结构体或类即使没有成员也需要一个字节的大小?
首先需要一个字节的作用在上个随笔中已经说明,是为了在生成实例的时候确定区别;但实际上在C里面是不支持空成员的结构体,直接报编译错误。
因此这是C++特有的特性,可能有如下的原因:
1.C++里面必须支持没有成员的类,比如纯虚类;这些类只有方法,没有数据成员(虽然会有虚表);但这些类不会被实例化。
2.为了达到统一,非纯虚类的C++结构体和类也会被C++支持,但他们需要实例化,所以需要提供一个字节来可以给他们分配内存。
而C里面是不支持没有成员的结构体(VC里面是编译不过的),其实完全没有必要支持这种无意义的定义,从而更简单。