Week 1 学习总结

关于每日一练

  1. 将源⽂件变成可执⾏⽂件称为编译过程,请问对编译效率影响最⼤的是哪个步骤?

Week 1 学习总结

  1. 原码、反码、补码、真值

    1)原码
    数字在以二进制表现的形式,其中正数的最高位为0,负数的最高位为1,其余位数表示该数字的绝对值

    2)反码
    正数的反码是它的原码本身
    负数的反码为保留其符号位,其余位取反

    3)补码
    在计算机系统中,数值一律用补码来表示和存储,使用补码,可以将符号位和数值域统一处理,同时,加法和减法也可以统一处理
    正数的补码是它的原码本身
    负数的补码是其反码加1

    4)真值
    真值是原码除去符号位的剩余位数表示的值,即数字的“绝对值”

  2. 大小端问题
    小端:高位字节排在内存的高地址端,低位字节排在内存的低地址端
    大端:高位字节排在内存的低地址端,低位字节排在内存的高地址端

    对于小端,强制转换类型时只需要在右边补全相应位数的0即可
    对于大端,比较容易判断正负,符号位的判定固定为第一个字节

变量的作用域&生命周期

1. 变量的作用域:与编译阶段有关,如果超出作用域,就会导致编译错误

变量的作用域范围为:变量的定义或者扩展定义,直到域结束为止。扩展定义域一般使用extern关键字在需要的位置进行扩展

  • 全局变量:基于全文件的作用域,需要用到文件编译
  • 静态全局变量:基于本文件的作用域 只和这个文件相关,其他文件无法使用
  • 函数内的局部变量:只能够在本函数当中使用,其他函数当中无法使用
  • 基于域的局部变量:只能够在域当中使用,域外部无法使用

使用extern只能扩充作用域,但是局部变量在对应的局部域当中没有真正定义,导致链接的过程当中找不到该变量,出现链接错误

2. 变量的生命周期:从变量的定义开始,到变量空间的释放结束。如果超过生命周期,就会导致运行错误

  • 对于非静态局部变量,一般我们称其定义的位置在栈区,当对应的域结束时,系统对这块空间进行释放

  • 可以手动申请存放到堆区,需要手动进行释放

  • 对于全局变量,其自带静态特性,可以通过static关键字声明变量存放在静态区

    static 关键字

  • 针对于生命周期,使其声明的变量存放到静态区,可以理解为给变量续命

  • 针对于作用域,其表示限定作用域,比如在某些.c文件中定义的函数,添加static限定该函数只能适用于当前的.c文件