首先,常用的基本类型占用的字节数:
bool 1byte(BOOL 4bytes ,其实际上是int型)
char 1byte
short 2
int 2~4不等,视操作系统而定,一般是4bytes
long 4
long long 8(个别操作系统会出现10等)
float 4
double 8
接着,将byte继续往下看。可以化为 bit ,一个byte = 8bit
1.bool 通常是1 byte,bool取值false和true,是0和1的区别; false可以代表0,但true有很多种,并非只有1。
如果数个bool对象列在一起,可能会各占一个bit,这取决于编译器。
2.char 1byte,即8bit,可以用一个8位的二进制数表示。例如字符‘A’,存在内存中并非如此,而至转换为一个二进制数,A貌似是65,即在内存中就是占8位bit,数值就是65的二进制表示形式。
3.short 占16bit位,如果将其化为有符号的和无符号数可分为两种 :unsigned short i; i可以表示0~65535 signed(默认)short i; i可以表示-32768~+32767(将第一bit位作为符号位,0表示正数,1表示复数)
在类型转换的时候,如果将4byte的int强制转换为2byte的short,则会出现内存截断,取其低位。
若是short转int,则会用short的2byte填补int的低位,若是出现复数,则会用符号填补高位。
4.float 4bytes,32bit。第一位为符号位,后面8位是无符号数,后面23位分别表示2的-1次幂到-23次幂,用来表示小数。
浮点数表示方法为(-1)s次幂(s为第一bit的数)乘以1.XXXX乘以2的(exp-127)次幂,exp是中间8bit表示的无符号数。所以浮点型数据表示的范围是3.4e + / - 38
如果
int i = 5;
float f = i;
cout<<f<<endl;
输出的还是5,只不过表示形式不一样了。转换为上述的公式形式。
int i = 37;
float f = *(float*)&i;
cout<<f<<endl;
输出的数不会是37,应该是个小数,但不确定是什么。
int i1 = 8390663;//2的23次幂 + 2的11次幂 + 7
short s1 = i1;
cout<<s1<<endl;
//发生内存截断,只保留了低位,输出2055,即2的11次幂 + 7
short s2 = -1;
int i2 = s2;
cout<<s2<<endl;
int i3 = 5;
float f3 = i3;
cout<<f3<<endl;
int i4 = 37;
float f4 = *(float*)&i4;
cout<<f4<<endl;
//内存转换了,应该在2的-20次幂左右,极小的数
float f5 = 7;
short s5 = *(short*)&f5;
cout<<s5<<endl;
//利用指针获取地址的方式取到了高位,输出0
一个小实例,大家有兴趣的可以试一下,也可以自己写一些有趣的例子,大家一起共享一下!