第四讲 数制与码制和基本数据类型
米醋电子工作室 主讲人: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}) |

进制转换:可以直接使用程序员计算器。
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 |
二、计算机存储体系
-
二进制:只有
0 / 1,硬件对应高电平 / 低电平 -
字位 (bit):1 位,取值 0 或 1
-
字节 (byte):
0101 0101,1 字节 = 8 bit -
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
3. 存储小数
十进制位权示例:632.4572
一、先看上面:8 位十进制例子
总共有 8 个数字字符,用来存数字
- 定点十进制格式:
xxxx.xxxx小数点固定放在第 4 位和第 5 位中间,位置永远不动。
-
例子:
0632.4572前 4 位0632= 整数部分;后 4 位4572= 小数部分 -
最大值:
9999.9999 -
最小正数:
0000.0001
缺点:8 个数字,被小数点切死,整数最多 4 位,小数最多 4 位,能表示的数范围很小。
- 浮点数(十进制科学计数法思想) 同样 8 个数字,不再固定小数点,拆成【阶数 + 有效数字】,小数点可以随便浮动。 示例:
632.4572 = 0.6324572 × 10^3 = 6.324572 ×10^2同样 8 个数字,既可以表示很大的数,也可以表示很小的小数。
二、下面:8 位二进制例子(重点!0110.1100,值 = 6.75)



四、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)
-

-

无符号整型 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 字符类型
-
有符号字符
char/signed char-
字长:1 字节(8bit)
-
表示范围:
-128 ~ 127
-
-
无符号字符
unsigned char-
字长:1 字节(8bit)
-
表示范围:
0 ~ 255
-
物理本质:都是 8 个 0/1 比特;
%c占位符输出字符;单引号' '书写字符常量。
3. ASCII 码
-
物理实在:8 位有符号整型
-
编码格式:找到对用的十进制ascll码,对应为8位有符号整型(二进制),即特殊的数制转换;
-
用户意义:数字、符号、大小写英文字母
-

例:二进制
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 |
浮点数精度丢失问题
-
部分十进制小数无法用二进制精确表示(例如十进制
0.1),会出现循环小数,精度丢失。 -
浮点数比较,谨慎直接使用
==、!=,建议采用误差范围判断。
五、综合练习
-
#define的进阶用法-
定义数据类型:
#define u8 unsigned char
u8 a;(定义一个无符号的字符类型)
-
-
关于
char类型的使用-
char在 C 语言里不只是用来存字符,它本质就是1 个字节大小的整数,可以存数字、做加减、判断真假,只是经常用来存放 ASCII 码字符而已。char:占 8bit,取值范围(有符号):-128 ~ 127int:一般占 32bit,只是大小不一样,都是整型





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

