第一周C语言第四节

第四讲 数制与码制和基本数据类型

米醋电子工作室 主讲人:May

前言:内容逐渐深入,有难度,课程系统无跳跃。建议老学员、学过 C 语言的同学也来听。

  • 数制:数学层面

  • 码制:将物理实在和数学逻辑联系起来的桥梁


一、数制

1. 常见数制(纯数学层面)

二进制、八进制、十进制、十六进制

  • 十进制:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

  • 八进制:1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20

  • 十六进制:1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20

2. 位权

示例十进制:632.45

表格

数字 6 3 2 4 5
位权 (10^2) (10^1) (10^0) (10^{-1}) (10^{-2})

image-20261006214532768

进制转换:可以直接使用程序员计算器。

3. 十六进制与二进制转换

  • 十六进制的1 个位刚好对应二进制 4 个位

  • 常用 2 位十六进制表示 1 个字节(8bit)(16进制的一位用四位二进制表示)

  • C 语言书写十六进制:前缀0x / 0X,例:0x10

表格

二进制 十六进制 二进制 十六进制
0000 0 1000 8
0001 1 1001 9
0010 2 1010 A
0011 3 1011 B
0100 4 1100 C
0101 5 1101 D
0110 6 1110 E
0111 7 1111 F

二、计算机存储体系

  1. 二进制:只有0 / 1,硬件对应高电平 / 低电平

  2. 字位 (bit):1 位,取值 0 或 1

  3. 字节 (byte):0101 0101,1 字节 = 8 bit

  4. CPU 字长:CPU 一次可以处理的数据长度;常见:8 位、16 位、32 位、64 位

内存概念模型:使用灯泡(0 灭 1 亮)模拟每一个 bit。

三、码制

1. 存储正整数(十进制)(一个字节,8 位)(可用两个十六进制表示)

范围二进制:0000 0000 ~ 1111 1111,对应十进制:0 ~ 255

示例数字 18:

  • 逻辑层面:18(0x12 )

  • 编码格式:进制直接转换

  • 物理实在(内存二进制):0001 0010

2. 存储带正负的整数(一个字节,8 位,有符号数)(十进制)

  • 最高位为符号位

    • 最高位 = 0:正数

    • 最高位 = 1:负数

原码、反码、补码(计算机实际存储使用补码)

项目 内容
编码格式 源码 反码 补码(常用)
物理实在 1 0000110 1 1111001 1 1111010
逻辑层面 -6

8 位结构:最高位符号位,剩余 7 位数值位;符号位:0=正数,1=负数

表格

编码类型 编码规则 +0 编码 -0 编码 取值范围
原码 1. 正数:符号位为 0,数值直接写绝对值二进制2. 负数:符号位为 1,数值位写绝对值二进制 0000 0000 1000 0000 -127 ~ +127
反码 1. 正数反码 = 正数原码2. 负数:符号位不变,数值位全部取反 (0↔1) 0000 0000 1111 1111 -127 ~ +127
补码(计算机实际使用) 1. 正数补码 = 正数原码 = 正数反码2. 负数补码 = 负数反码 + 13. 运算溢出产生第 9 位时,直接丢弃进位 0000 0000 与 + 0

补码原理:模运算,时钟模型;互为补数的两个数相加得到模。例如模 12,-1 等价于 + 11。

补码统一了加减计算规则:减一个数等于加上这个数的反码。例如:6+3==6+(3的补码)。3的补码:11111111-00000011

image-20261006223410079

3. 存储小数

十进制位权示例:632.4572

一、先看上面:8 位十进制例子

总共有 8 个数字字符,用来存数字

  1. 定点十进制格式:xxxx.xxxx 小数点固定放在第 4 位和第 5 位中间,位置永远不动。
  • 例子:0632.4572 前 4 位0632 = 整数部分;后 4 位4572= 小数部分

  • 最大值:9999.9999

  • 最小正数:0000.0001

缺点:8 个数字,被小数点切死,整数最多 4 位,小数最多 4 位,能表示的数范围很小。

  1. 浮点数(十进制科学计数法思想) 同样 8 个数字,不再固定小数点,拆成【阶数 + 有效数字】,小数点可以随便浮动。 示例:632.4572 = 0.6324572 × 10^3 = 6.324572 ×10^2 同样 8 个数字,既可以表示很大的数,也可以表示很小的小数。

二、下面:8 位二进制例子(重点!0110.1100,值 = 6.75)

image-20261006225544341

image-20261006225544341

image-20261006225652982

四、C 语言中的基本类型

1. 整型

有符号整型 int

  • int等价于signed int;signed可以省略

  • 64 位电脑常见:4 字节(32bit);值域:(-2^{31} \sim 2^{31}-1)

  • 16 位单片机:2 字节(16bit);值域:(-2^{15} \sim 2^{15}-1)

  • image-20261006230534696

  • image-20261006230150282

无符号整型 unsigned int

  • unsigned不能省略

  • 字节大小和 int 一致;值域:(0 \sim 2^{32}-1)(4 字节)

长整型与短整型

表格

类型 字节数
short int 2
long int 4 / 8
long long int 8

可以自由组合,例:unsigned long long int

2. char 字符类型

  1. 有符号字符 char / signed char

    • 字长:1 字节(8bit)

    • 表示范围:-128 ~ 127

  2. 无符号字符 unsigned char

    • 字长:1 字节(8bit)

    • 表示范围:0 ~ 255

物理本质:都是 8 个 0/1 比特;%c占位符输出字符;单引号' '书写字符常量。

3. ASCII 码

  • 物理实在:8 位有符号整型

  • 编码格式:找到对用的十进制ascll码,对应为8位有符号整型(二进制),即特殊的数制转换;

  • 用户意义:数字、符号、大小写英文字母

  • image-20261006231413578

例:二进制0110 0111,对应十进制 103,用户含义字符 'g'。

4. 大小端模式

同一个多字节数字,在内存中字节存放顺序不一样。 示例数字 3:

  • 大端:00000000 00000011

  • 小端:00000011 00000000

5. 浮点数

表格

类型 符号位 指数位 尾数位
float(单精度) 1 位 8 位 23 位
double(双精度) 1 位 11 位 52 位

printf /scanf 格式符

表格

格式符 说明 适用类型
%f 输出小数形式 float / double
%e 科学计数法小写 e float / double
%E 科学计数法大写 E float / double
%g 自动选择 f/e,去掉无效末尾 0 float / double
%lf scanf 读取 double 输入 double
%Lf long double 输入输出 long double

浮点数精度丢失问题

  1. 部分十进制小数无法用二进制精确表示(例如十进制0.1),会出现循环小数,精度丢失。

  2. 浮点数比较,谨慎直接使用 ==、!=,建议采用误差范围判断。

    image-20261006232504973

五、综合练习

  1. #define 的进阶用法

    • 定义数据类型:

      #define u8 unsigned char

      u8 a;(定义一个无符号的字符类型)

  2. 关于char类型的使用

    • char 在 C 语言里不只是用来存字符,它本质就是1 个字节大小的整数,可以存数字、做加减、判断真假,只是经常用来存放 ASCII 码字符而已。

      char:占 8bit,取值范围(有符号):-128 ~ 127 int:一般占 32bit,只是大小不一样,都是整型

    image-20261007095613454

    image-20261007095918282

    image-20261007101134888

    image-20261007101510318

    image-20261007101930289

  3. 类型强制转换(不改变物理实在,只是解析方式改变)

    image-20261007102416183