一、数据类型的介绍
char short int long long long float double
☆类型的意义:
①使用这个类型开辟内存空间的大小。
②如何看待内存空间的视角。(比如可以看到是整型还是浮点型,从而知道它是如何存储的)
1、整型家族:
char //没有规定char是有符号的还是无符号的,这取决于编译器
signed char
unsigned char
short
signed short
unsigned short
int
signed int
unsigned int
long
signed long
unsigned long
2、浮点型家族
float
fouble
3、构造类型
①数组类型
②结构体类型 struct
③枚举类型 enum
④联合类型 union
4、指针类型
int* pa
char* pa
float* pa
void* pa
5、空类型
void表示空类型(无类型)
通常应用于函数的返回类型、函数的参数、指针类型
如:函数返回类型 void test();
函数参数 void test(void) (无参数)
指针 void* p
二、整型在内存中的存储
1、数据在内存中以二进制的形式存储,而二进制有原码、反码、补码三种表现形式。
①一个整数在内存中是以补码的形式存放的
②原码(符号位不变,其他位按位取反)<==>反码(反码+1)<==>补码(符号位不变,其他位按位取反,取反后+1)-->原码
③补码在内存中存储的顺序分为,大端字节序和小段字节序
大端字节序:是指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中;
小端字节序:是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中;
2、分析一些整型存储的代码:
#include<stdio.h>
//第一个代码
//int main()
//{
// char a[1000];
// for (int i = 0; i < 1000; i++)
// {
// a[i] = -1 - i;
// }
// printf("%d",strlen(a));
// return 0;
//}
//第二个代码
//int main()
//{
// unsigned int i;
// for (i = 9; i >= 0; i--)
// {
// printf("%u\n",i);
// }
// return 0;
//}
//第三个代码
//int main()
//{
// char a = -1;
// signed char b = -1;
// unsigned charc = -1;
// printf("a=%d,b=%d,c=%d",a,b,c);
// return 0;
//}
//第四个代码
//int main()
//{
// char a = -128;
// printf("%u\n",a);
// return 0;
//}
//第五个代码
//int main()
//{
// char a = 128;
// printf("%u\n",a);
// return 0;
//}
//第六个代码
//int main()
//{
// int i = -20;
// unsigned int j = 10;
// printf("%d\n",i+j);
// return 0;
//}
//第七个代码
//unsigned char i = 0;
//int main()
//{
// for (i = 0; i <= 255; i++)
// {
// printf("hello world\n");
// }
// return 0;
//}
三、浮点型在内存中的存储
浮点数表示的范围在<float.h>中
整型表示的范围在<limits.h>中
1、浮点数和整数在内存中存储和取出的方式是不相同的。
2、浮点数的存储
根据国际标准IEEE754,任意一个二进制浮点数V都可以表示成下面的形式:
(-1)^S*M*2^E
其中,(-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。
M表示有效数字,大于等于1,小于2
2^E表示指数位
①float:对32位的浮点数,最高的1位是符号位S,接着的8位是指数E,剩下的23位为有效数字M
②double:对64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M
③IEEE754对有效数字M和指数E,还有一些特别的规定
存入内存时:
<1>对有效数字M:
因为1=<M<2,所以M可以写成1.xxxxxxxxxx的形式,其中xxxxxxxxx表示小数。IEEE754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍弃,只保存后面的xxxxxxxx部分。等到读取的时候再把第一位的1加上去,这样做的目的是可以节省1位有效数字,即32位的浮点数值留给M了23位,将1舍弃后就可以保存24位有效数字。
<2>对指数E
E是一个无符号整数,也就是说,如果E是8位的,那么它的取值范围为0~255。如果E为11位的,那么它的取值范围为0~2047。但是科学计数法中的E是可以出现负数的,所以IEEE754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。
从内存中取出时:
<3>对指数E
1)E不全为0、不全为1
指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1。
2)E全为0
这种情况下,浮点数的指数E等于1-127(或1-1023)为真实值,有效数字M不再加上第一位的1,而是还原为0.xxxxxxxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。
3)E全为1
这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位S)