C语言深度剖析(壹)

一、程序的运行

  1. 在win中,双击的本质的本质是运行程序,将程序加载到内存当中,任何程序在加载之前都必须被加载到内存当中。而无论是局部变量还是全局变量都是在程序运行时动态分配内存空间的,所以变量本质是在内存中的某个位置开辟空间的(register修饰的变量除外【下文会讲到】)。
  2. 输入设备(硬盘,键盘)——>内存(内存把数据传输给CPU进行计算,CPU再把计算结果返回给内存)——>输出设备(显示器)

二、定义与声明

  1. 定义:用于开辟空间存贮变量,只能有一次。
  2. 声明:用于告知,不开辟空间,可以有多次。声明关键字:extern        
  3. 声明变量时必须带extern,函数声明时建议带extern 
  4. int g_val = 10;  声明:extern int g_val;(不能赋初始值,因为声明并没有开辟空间) 函数 void show();   声明:extern void show();                                                           函数 void show (int x);  声明:extern void show(int x)(怎么定义怎么声明,定义与声明必须严格一致)

三、生命周期&作用域

  1. 生命周期:什么时候开辟,什么时候释放(从变量内存空间开辟到释放的过程)
  2. 作用域:该变量的有效区域

四、关键字(register,static)

1.register

  • register修饰变量,尽量将所有的变量放入CPU寄存器当中,提高效率。
  • register将变量放入CPU寄存器当中,故该变量没有地址,也不能取地址(内存中的变量才有地址)
  • 什么样的变量用register修饰:a.局部的(全局变量会导致CPU寄存器被长时间占用)                                                              b.不会被写入的(写入就需要重新被写回内存)                                                                          c.高频读取

2.static

  • static修饰局部变量:更改该局部变量的生命周期,只是生命周期是全局的,但作用域不变,依旧只在本代码块内有效。
  • static修饰全局变量:影响该变量的作用域,生命周期无影响,该变量只能在本文件内被访问,不能被外部文件直接访问。
  • static修饰函数:该函数只能在文件内部被使用,不能被外部其他文件直接使用。

五、.h头文件

  1. 为什么要使用头文件:单纯使用源文件组织项目结构时,项目越大越复杂,维护成本会越来越高。
  2. .h文件是被多个源文件包含,可能会有一个问题,头文件被重复包含,解决方法:在.h文件中加 #pragma once

六、定义变量命名规律

  1. 当标识符有多个词组成时,每个词的第一个字母大写 int CurrentVal
  2. 尽量避免出现数字
  3. 全局变量g_名字
  4. 不能出现仅靠大小写区分的变量 X x  I i  P p
  5. 所有宏定义,枚举常数,只读变量全用大写字母命名,用下划线分割单词
  6. 定义变量时一定初始化,不做初始化内容是随机值

七、原码反码补码

  1. 正数和无符号数:原码 = 反码 = 补码
  2. 负数:反码 = 原码除符号位其他位按位取反    补码 = 反码 + 1 (二进制计算中加减法符号位也要参与运算)
  3. 补码 ——> 原码    a.补码 - 1 后再符号位不变其他位按位取反    b.从原码到补码重新做一次(补码的补码即为原码)
  4. 二进制快速转化口诀:2^n就是1后面跟n个0    2^3:1000   2^4:10000                                                                         67 ——>  64  +  2   +   1                                                                                                                            2^6    2^1     2^0                                                                                      0000   0000   0000   0000   0000   0000  0100   0011
  5. 为什么计算机都是补码?计算机中所有计算最终都会被转化成加法,此过程需要依靠补码。
  6. 为什么要全部转化成加法?CPU硬件计算电路只要设计一套就够了

八、变量的存与取

  1. 变量存的过程:将字面数据转化成补码,再放入空间当中,所以,所谓符号位完全看数据本身是否携带正负号,和变量是否为有符号数有关。
  2. 变量取的过程:先看自身类型(%还是%d)实际上与signed还是unsigned无关,只会在输出时看是%d还是%u,若为%d则将他当做一个有符号数,按有符号数的输出规则输出,若为%u则将他当做一个无符号数,按无符号数的输出规则输出

1.两种存储方式

  • 大端存储:按照字节为单位,低权值数据放在高地址处
  • 端存储:按照字节为单位,权值数据放在地址处                                                            
  • 小                                           小                      小(口诀:小小小)

2.如何取

  • 先看是大端还是小端存储,按特定的方法将补码取出来
  • 再看自身类型,进行转化

九、类型的取值范围

1.char的取值范围

  • char的大小为1个字节(8个比特),所以可表达8个比特位,其中1个符号位7个数值位             取值范围为  0 111 1111 ~ 1 111 1111  但是其中 0 000 0000 与 1 000 0000重复都为0,计算机为了避免浪费,提高效率将1 000 0000规定为 -128
  • -128 二进制原码:1 1000 0000     反码: 1 0111 1111  补码:1 1000 0000                               为什么会出现第9个比特位? 因为计算需要寄存器等多个硬件参与,可以出现第九个比特位,因为寄存器位数有多个                               
  • 发生截断-128以1000 0000放入内存中,所以1000 0000表示-128(半计算半规定)

所以char的取值范围【-2^7, 2^7-1】

任意类型取值范围

n个比特位:【-2^(n-1) , 2(n-1)-1】

END 文章出自 https://mp.csdn.net/mp_blog/creation/editor/136426835?spm=1000.2115.3001.5352

个人主页:是冬至呀-CSDN博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值