【C语言进阶 个人课堂随笔】

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.011
2^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时,则表示无穷大(正负取决于符号位 )

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值