CDay02

进程的虚拟内存空间

变量和常量

变量

变量:在程序运行的过程中可以发生改变的量
变量的本质:一块可写的内存空间

变量的三要素:数据类型(这片内存有多大?如何解释这片空间里的数据?)、变量名(如何引用这片内存中的数据?)、值(这片内存中的数据是什么?)

常量

常量:在程序运行的过程中不可以发生改变的量

例如:const int M = 5;
此时M对应的是一块不可写的内存空间,运行阶段才能知道M的大小。M不能作为数组的长度也不能作为case的标签!

标识符和关键字

标识符

程序员给变量、函数、宏等起的名字。

规则:

  • 标识符只能包含数字、下划线和字母
  • 标识符不能以数字开头

规范:核心是要达到见名知义的效果,常用驼峰命名法。

关键字

对C语言有特殊含义的名称

可以在此网站内查询:cppreference

输入输出模型

核心矛盾:CPU、内存和I/O设备处理数据的速度存在很大的差异!我们可以形象的描述为:CPU一天,内存一年;内存一年,I/O十年。(假设 CPU 执行一条普通指令需要一天,那么 CPU
读取内存就需要一年;假设内存之间传递单位数据需要一天,那么内存与 IO 设备之间传递单位数据就需要十年)。

木桶原理:一个木桶能装多少水,取决于该木桶最短的木板。
CPU与内存之间的差异可以通过高速缓存、TLB、编译器优化...来进行缓解;
内存与I/O直接按的差异可以通过缓冲区(buffer)、缓存(cache)...来进行缓解。

为了平衡这三者之间的差异,一个有效的手段是引入缓存。缓存在计算机世界中是随处可见的,如下图所示:

格式化输出printf

原型:int printf(格式化字符串,表达式1,表达式2,...);

作用:显示格式化字符串中的内容,并在格式化字符串指定的位置插入相应表达式的值。

转换说明的作用:

  • 编码(以什么样的方式解释这片内存空间的数据)
  • 控制输出格式

转换说明的格式:

最小字段宽度(m):指定最少要占用的宽度
精度 (precision) p 的含义依赖于转换说明符 (conversion specifier) X 的选择。X 指示对数值进行哪种转换。常用的转换说明符有以下几个:

  • d —— 表示十进制整数。p 表示待显示数字的最小个数 (必要时在数字前面补 0);如果省略 p,则默认为1。
  • f —— 表示“定点十进制”形式的浮点数。p 表示小数点后数字的个数 (默认为 6)。如果 p 为 0,则不显示小数点。

示例:

printf的返回值:输出字符的个数
示例:

则i = 13。

格式化输入scanf

原型:int scanf(格式化字符串,表达式1,表达式2,...);

scanf的本质:其本质是一个“模式匹配”函数,它试图将你输入的数据与格式化字符串进行匹配。
scanf的工作原理:从左往右依次匹配格式化字符串,如果匹配成功,则继续往下匹配,否则立即返回。
示例:

转换说明的作用:

  • 表示匹配规则
  • 表示如何将字符数据(从键盘输入的数据)转化为对应的二进制数据(编码)

常用的转换说明:
%d:匹配有符号的十进制整数;%f:匹配浮点数,以上两种转换说明均会匹配前置的空白字符。
示例:

scanf的返回值:成功匹配的转换说明的个数。

基本数据类型

  • 整数类型
  • 浮点数类型
  • 字符类型

整数类型

  • 无符号整数
  • 有符号整数

short (int)
unsigned short (int)

int
unsigned (int)

long (int)
unsigned long (int)

long long (int)
unsigned long long (int)

注意事项:

  • C语言没有明确规定整数类型的大小,可能随着机器的不同而不同
  • C语言规定了各个整数类型的最小大小:int ≥ 2bytes,long ≥ 4bytes,long long ≥ 8bytes
  • C语言规定各个整数类型的大小顺序:short ≤ int ≤ long ≤ long long

编码

  • 无符号整数->二进制编码
    示例:

  • 有符号整数->补码
    示例:

有符号整数为什么要用补码进行编码?
答:因为这样可以利用加法器做减法运算。即:a-b = a+(-b)

计算机运算的时候都是以补码的方式运算的。

计算示例


特例:1111 1111(补码) = -2^7 + 2^6 + ... + 2^0 = -2^7 + (2^7 - 1) = -1

数学原理:模运算、抽象代数

整数字面值

三种表示方式:

  • 十进制:1234
  • 八进制:以0开头,0125
  • 十六进制:以0x开头,0xFF

例:

整数字面值的类型:

  • 十进制:int -> long -> long long -> unsigned long long -> 报错
  • 八进制、十六进制:int -> unsigned int -> long -> unsigned long ->long long -> unsigned long long -> 报错

程序员可以通过添加后缀来指定整数字面值的类型:

  • U(u) -> unsigned:43U
  • L(l) -> long:43L
  • LL(ll) -> long long:43LL
  • 混合使用:43ULL

注意事项:添加后缀时用大写(以免l看成1)

读写整数类型

  • %d:decimal , 读写有符号的十进制整数
  • %u:unsigned , 读写无符号的十进制整数
  • %o:octal , 读写无符号的八进制整数
  • %x:hexdecimal , 读写无符号的十六进制整数
  • 读写short:在u、o、x、d的前面加 h
  • 读写long:在u、o、x、d的前面加 l
  • 读写long long:在u、o、x、d的前面加 ll

浮点数类型

  • float
  • double
  • long double(用于高精度的数值计算中,一般用不到)

编码(IEEE754标准)

以float为例:


Sign(S):符号位,0正1负
Exponent(E):指数位,其真实值要减去127(2^7 - 1),故可以表示的范围是-127 ~ 128,可以表示的指数范围是-126 ~ 127,其中-127(全0)和128(全1)有特殊用途。
Fraction(F):小数部分

三个特殊值:

  • E:0000 0000,F:0000 0000,表示 ±0
  • E:1111 1111,F:0000 0000,表示 ±∞
  • E:1111 1111,F:不全为 0,表示 NaN(Not a Number)
规范数

指数范围 E∈[0000 0001 , 1111 1110]

非规范数

E:0000 0000,F:不全为0
表示十分接近于 0 的数,非规范数的绝对值都比规范数的绝对值小

示例,计算float能表示的最小正数和最大正数:

double类型

Sign(S):符号位,0正1负
Exponent(E):指数位,其真实值要减去1023(2^10 - 1),故可以表示的范围是-1023 ~ 1024,可以表示的指数范围是-1022 ~ 1023,其中-1023(全0)和1024(全1)有特殊用途。
Fraction(F):小数部分

double类型的最大正数:
s = 0,E = 1023,F = 1111...1(52个1)。
最大正数 = (-1)^0 * 1.1111...1 * 2^1023 约等于 2^1024

double类型的最小正数:
s = 0,E = -1022,F = 0000...01(51个0).
最小正数 = (-1)^0 * 0.0000...01 * 2^-1022 = 1 * 2^-52 * 2^-1022 = 2^-1074

浮点数的字面值
表示方法:要么包含字母e,要么包含小数点。
例:

浮点数的字面值默认为double,如果要表示float类型,在浮点数末尾加F(f)。

读写浮点数

总结

posted @   TommyShelbyyyyy  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示