数据类型
整形家族
- char //字符类型(分为signed char与unsigned char,signed char 的范围为-128-127,unsigned char 的范围为0-255)
- short //短整型(分为signed short与 unsigned short,signed short 的范围为-32768-32767,unsigned short的范围为0-65535)
- int //整形(同short)
- long //长整形(分为signed long 与unsigned long,signed long的范围为-2147483648-2147483647,unsigned long的范围为0-4294967295)
浮点型家族
- float //单精度浮点型
- double //双精度浮点型
构造类型
- 数组类型
- 结构体类型struct
- 枚举类型enum
- 联合类型union
指针类型 空类型
- void
整形在内存中的存储
- 原码、反码、补码
对于整形来说,数据存放内存存放的是补码 - 大小端介绍
大端指数据的低位保存在内存的高地址中,数据的高位,保存在内存的低地址中(例如1的二进制为00 00 00 01,它的大端表示为00 00 00 01)
小端指数据的低位保存在内存的低地址中,数据的高位,保存在内存的高地址中(1的小端表示为01 00 00 00)
一道笔试题:设计一个小程序判断当前机器的字节序
int check_sys()
{
union
{
int i;
char c;
}un;
un.i = 1;
return un.c;
}
int main()
{
int ret = check_sys();
if (ret == 1)
printf("小端");
else
printf("大端");
return 0;
}
之所以用联合体是因为联合体的成员共用同一块内存空间
- 几个练习
char a = -1;
signed char b = -1;
unsigned char c = -1;
printf("%d %d %d", a, b, c);
结果为-1 -1 255,因为unsigned char的范围为0-255,不可能为负数,-1为0的前一个,因此为255
unsigned int i;
int main()
{
for (i = 9; i >= 0; i--)
{
printf("%u\n", i);
}
system("pause");
return 0;
}
结果为死循环,因为i为unsigned int 型,永远大于0.
- 浮点型在内存中的存储
举个例子说明
int main()
{
int n = 9;
float *PFloat = (float*)&n;
printf("n的值为:%d\n", n);
printf("PFloat的值为:%f\n", *PFloat);
*PFloat = 9.0;
printf("num的值为:%d\n", n);
printf("PFloat的值为:%f\n", *PFloat);
return 0;
}
结果为n的值为9,*PFloat的值为0.000000,num的值为1091567616,*PFloat的值为9.000000
因为二进制浮点数可以表示成(-1)^S *M *2^E, (-1) ^ S表示符号位,S=0,表示正数,S=1,表示负数,M表示有效数字,2^E表示指数位.(对于32位的浮点数,最高的一位是符号位S,接着的8位是指数E,剩下的23位为有效数字M.对于64位浮点数,最高的一位是符号位S,接着的11位为指数E,剩下的52位为有效数字M.)
E为一个无符号整数,但是科学计数法中是可以出现负数的,因此存入内存时E的真实值必须加上一个中间数,对于8位的E,中间数为127,对于11位的E,中间数为1023.
E从内存中取出又能分为三种情况:
- E不全为0或不全为1
规则为E减去127(或者1023),将有效数字M加上第一位的1 - E全为0
规则为E为1-127(或者1-1023),有效数字不加第一位的1,还原为0.xxxx的小数。 - E全为1
如果有效数字M全为0,表示无穷大
1.整数转换为浮点数,9可以表示成S=0,E=0000 0000(E全为0),则M=000 0000 0000 0000 0000 1001,E=1-127=-126,M还原为0.xxxxx的小数,为0.000 0000 0000 0000 0000 1001,即结果为0.000 0000 0000 0000 0000 10012^-126=1.001 * 2^(-126-20)≈0.000000。
2.浮点数转换为整数,9.0的二进制表示为1001.0,即为1.001 * 2^3=(-1) ^01.001 * 2^3,即S=0,M=1.001,E=3+127=130,则S+M+E表示为二进制为:0 10000010 001 0000 0000 0000 0000 0000,转换为十进制为1091567616 。