一.数据类型
整形类型
1.short
包括unsigned short,signed short
2.int
包括unsigned int,signed int
3.long
包括unsigned long,signed long
4.char
包括unsigned char,signed char
unsigned 表示无符号类型,只能表示大于等于零的数
signed 表示有符号类型,可以表示负数最高位是符号位,如果最高位是1,则是负数,最高位为零则为正数
char的类型到底是unsigned char 还是signed char是由平台和编译器决定,而short,int,long默认都是带符号的整形
浮点型
1.float
2.double
3.long double
二.整型在内存中的存储
1.三种计算机二进制表示方法,原码,反码,补码
原码:直接将数值按照正负数的形式翻译成二进制就可以得到原码
-7的原码为10000000000000000000000000000111
7的原码为 00000000000000000000000000000111
反码:将原码的符号位不变,其他位次按位取反
-7的反码为111111111111111111111111111111111000
7的反码为 00000000000000000000000000000111
补码:反码符号位不变,数值为+1
-7的补码为111111111111111111111111111111111001
7的补码为 00000000000000000000000000000111
注意正数的原码,反码,补码一样,负数按上面的规则。
为什么计算机在存储数据用补码?
补码是为了解决负数在计算机中的表示问题,最终是为了解决计算机的减法运算问题
由上图可知计算机在内存中存的就是补码
三.电脑大小端
小端模式:数据的高字节存放在高地址。读取方向从高地址到低地址。
大端模式:数据的高字节存放在低地址。读取方向从低地址到高地址。
f9为数据低字节放在了低地址处,所以是小端模式。
大小端的判断
int main()
{
int a =1;
//0000 0000 0000 0000 0000 0000 0000 0001
0 0 0 0 0 0 0 1
if ((char*)&a)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
对&a如果用char*指针解引用得到的是一个字节的数据,如果a的首地址解引用是一的话,因为a的首地址是低地址,而00000001是数据低地址段,则符合小端模式,如果取出来是00000000的话,则说明在a首地址的低地址段取出来的是数据的高地址为,则称为大端模式
四.浮点型在内存中的存储
在内存中,浮点数是以符号位、指数位、尾数位的顺序存储。
根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数可以表示成下面的形式:
(-1)^S * M * 2^E(即用科学计数法表示),
float类型占四个字节,属于32位浮点数,最高的一位时符号位,中间的8位为指数位,后面的23位属于尾数位,其中S为符号位,E为指数位,M为尾数位
double类型占八个字节,属于64位浮点数,最高的一位时符号位,中间的11位为指数位,后面的52属于尾数位,其中S为符号位,E为指数位,M为尾数位。
其中M的范围为1.0~2(2取不到),所以第一位一定是一,如果是32位浮点数,后面的23位可以不将1存入,则可以存入23位小数位,增加了精确度,如果将1存入,则只有22位去存小数位,取出的时候记得前面还有个1。
E的存入,E为无符号整数,E如果是8位取值范围为0~255;E如果是11位取值范围为0~1023;
但科学计数法中的E是可以出现负数的。所以IEEE 754规定,存入内存时E的真实值必须加上一个中间值。对于8位的E,中间值位127。对于11位的E,中间值为1023。
E的取出
E不全为0或不全为1
减去中间值即可,对于8位的E,中间值位127。对于11位的E,中间值为1023。
E全为0
E等于1-127(或者1-2023)即为真实值,有效数字M不再加上第一位的1,而是还原为0.XXXXXXXXXX的小数,这样为了表示+-0,以及接近于0的很小的数字。
E全为1
取出为255减去中间值(127)=128,如果M趋于0,乘以2的128差不多趋于无穷,表示+-无穷大
举例说明
5.5-十进制浮点数
二进制:101.1
S=0;
E=2;
M=1.011
E+127
正数S=1;
M不存前面的1,后面存入不够补0
存入0100 0000 1011 0000 0000 0000 0000 0000
对应十六进制
举例2
-0.5——十进制浮点数
二进制:-0.1
S=1;E=-1;M=1.0
存入1<- S E+127->011 1111 0 ->M 000 0000 0000 0000 0000 0000
对应十六进制
0x b f 0 0 0 0 0 0
如果哪里有不对的地方,请大家指教,谢谢大家了