1.数据类型介绍
char short int long long long float double
类型的意义
- 使用该类型所需要开辟内存空间的大小
- 看待内存空间的视角
1.1类型的基本归类:
整形家族
char unsigned char signed char short unsigned short signed short int unsigned int signed int long unsigned long signd long
浮点型家族
float double
指针类型
int*a char*b float*c void*d
空类型
void表示空类型 通常用于函数的返回类型,函数的参数和指针类型
2.整形在内存中的存储
2.1原码,反码,补码
计算机中整数的三种二进制表示方法:原码,反码和补码。
三种表示方法均有符号位和数值位两部分
符号位”0“表示正,”1“表示负
正数的原码,反码和补码都相同
负数的表示方法需要通过计算
原码 直接将整数按照正负数翻译成二进制即可得到原码 反码 原码符号位不变,其余位依次按位取反即可得到反码 补码 反码+1即可得到补码
内存在计算机中的存储
数据是以补码的形式存放在内存中,数据以二进制存储,以十六进制展示
整形a的补码顺序不太对,为什么是反着的
2.2 大小端介绍
大端字节序存储:数据的低位保存在内存的高地址中,高位保存在内存的低地址中。 小端字节序存储:数据的低位保存在内存的低地址中,高位保存在内存的高地址中。
3.浮点型在内存中的存储
3.1浮点数存储规则
根据国际标准,任意一个二进制浮点数 F 都可以表示成下面的形式
(-1)^S*M*2^E (-1)^S 表示符号位,当S=0,F为正数:当S=0,F为负数 M表示有效数字,大于等于1,小于2 2^E表示指数位
例如
十进制5.5,二进制形式是101.1 相当于1.011*2^2
按照上面的格式,可以得出 S=0, M=1.011, E=2
标准规定:
对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位是有效数字M。
对于64位的浮点数,最高的1位是符号位s,接着的11位是指数E,剩下的52位是有效数字M。
特别规定:
对于M :
由于1<=M<2,M可以表示成 1.xxxxxxx,
在计算机中存储M时,默认第一位总是1,只保存后面小数部分
等读取时,再把第一位的1加上去。此操作的目的是提高精度
对于E(无符号整数 unsigned int)
存储在内存中
如果E为8位,取值范围为0~255,由科学计数法可知E是可以出现负数的,所以标准规定,再存入内存时E的真实值必须加上中间数,对于8位的E来说,中间值就是127
从内存中取出,可分三种情况
E不全为0或不全为1 指数E的值减去127,即得到真实值,再将有效数字M的第一位前加上1 E全为0 此时指数E等于1-127,有效数字M不再加上第一位的1,即为真实值 趋近于0 E全为1 如果有效数字M全为0,则表示无穷大
3.2一个例子
#include<stdio.h> int main() { int a = 9; float* p = (float*)&a; //以整形的形式存储,以整形的形式取出 printf("a的值:%d\n", a);//9 //以整形的形式存储,以浮点型取出 //00000000000000000000000000001001 //s=0 //E=1-127 //M=0.00000000000000000001001 //*p=0.00000000000000000001001*2^(-126) printf("*p的值:%f\n", *p);//0.000000 *p = 9.0; //以浮点型存储,以整形取出 //1001.0 //1.001*2^3 //s=0 E=3 M=1.001 //0 10000010 00100000000000000000000 //符号位是零,原码,反码和补码相同 printf("a的值:%d\n", a); //以浮点型存储,以整形取出 printf("*p的值:%f\n", *p);//9.000000 return 0; }
代码输出结果如下