C语言进阶的学习
数据的存储
C语言的内置类型
- char 字符数据类型 1
- short 短整型 2
- int 整型 4
- long 长整型 4/8
- long long 更长的整型 8
- float 单精度浮点型 4
- double 双精度浮点型 8
C语言没有字符串类型
C语言规定sizeof(long)>=sizeof(int),所以长整型得到大小可能是4也可能是8
整型家族
- char
-
unsigned char
-
signed char
- short
-
unsigned short
-
signed short
- int
-
unsigned int
-
signed int
- long
-
unsigned long
-
signed long
浮点型家族
- float
- double
构造类型(自定义类型)
- 数组类型
- 结构体类型 struct
- 枚举类型 enum
- 联合类型 union
int arr[10]—>int [10]
int arr[5]—>int [5]
数组类型不同
指针类型
- int * p
- char *pc
- struct *node
空类型 void
整型数据在内存中的存储
int a; 向内存申请分配四个字节,在计算机系统中数值一律用补码存储
计算机中的整数有三种2进制得到表示方式,即原码,反码,补码
三种表示方法均有符号位和数值位两部分,符号位都是用0表示正,用1表示负。
而数值位正数的原码,反码,补码相同。
负整数的三种表示方式各不相同
原码:直接将数值按照正负数的形式翻译成二进制就可以得到原码
反码:将原码的符号位不变,其他依次按位取反就可以得到反码
补码:反码+1得到补码
int a=10;
原码:0 0000000 00000000 00000000 00001010
反码:0 0000000 00000000 00000000 00001010
补码:0 0000000 00000000 00000000 00001010
int a=-10
原码:1 0000000 00000000 00000000 00001010
反码:1 11111111 111111111 111111111 111110101
补码:1 11111111 111111111 111111111 111110110
编译器中查看内存时显示的16进制的补码
同时,存储补码加法与减法也可以统一处理(CPU只有加法器)
大小端
以字节为单位讨论存储数据
大端字节序存储:把一个数据的低位字节的内容。存放在高地址出,把一个数据的高位字节的内容。存放在低地址出。
小端字节序存储:把一个数据的低位字节的内容。存放在低地址出,把一个数据的高位字节的内容。存放在高地址出。
判断大小端存储
#includ <stdio.h>
int main()
{
int a=1;
if(*(char*)&a==1)
printf("小端存储");
else
printf("大端存储");
}
return 0;
有符号和无符号的区别
一般默认int----->signed int ,使用无符号写作unsigned int
signed char a=1 0 0000001 首位作为符号位,其余作为数值位 范围为-128~127
unsigned char a=1 00000001 全部作为数值位,无符号位
范围为0~255
表示范围在头文件 <limits.h>中可看到
整型提升判断
int main()
{
char a=-1;
signed char b=-1;
unsigned char c=-1;
printf("a=%d b=%d c=%d" a,b,c);
return 0;
}
当char类型以int类型打印时,整型提升,有符号类型补符号位,无符号类型补0,再以原码反码补码进行转换。
浮点数在内存中的存储
浮点数的范围在头文件<float.h>中可看到
任意的二进制浮点数V可以表示成下面形式:
(-1)^S * M * 2^E
(-1)^S表示符号位,当S=0时,V为正数;当S=1时。V为负数
M表示有效数字,大于等于1,小于2
2^E表示指数位
十进制的5.5 表示为二进制的浮点数为:101.1
101表示5 ,0.1表示12^(-1)
科学记数法表示为 1.0112^2
转换为存储形式为 (-1)^0 *1.011 * 2^2
若小数位为 0.14 ,12^(-3)=0.125—>0.001, 12 ^(-4)=0.0625,不断凑出0.14,可能不能精确
IEEE754规定
对于32位单精度浮点数(float),最高位的1位是符号位S,接着的8位是指数E,剩下的23位为有效数字M
对于64位双精度 浮点数(double),最高位的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M
保存有效数字M时,默认第一位为1,可以舍去不保存,后面取出时加上1,等于可以保存24位有效数字
指数E为无符号整数,为8位时,取值范围为0-255,为11位时,取值范围为0-2047,但是科学计数法中E要可以出现负数,所以存入内存时E的真实值必须加上一个中间值,将负数转化为正数,对于8位的E中间值为127,对于11位的E中间值为1023,取出实际值时,在减去中间数作为指数。所以浮点数也有取值范围。
E的取出也分三种情况:
E不全为0或全为1时,E的计算值减去127(或1023)得到真实值
E全为0时,指数E等于1-127(或者1-1023)即为真实值
E全为1时,则表示无穷大(正负取决于符号位 )