C语言基础:常量、二进制与数据类型详解
常量的定义与使用
程序运行期间值不可更改的量称为常量。通常建议常量名采用大写形式,以区别于变量。
常量类型
- 字面量常量:直接书写在代码中的数值或字符,如整数
10、浮点数3.14、字符'A'。 - 标识符常量:通过命名方式定义的常量,可通过两种机制实现。
标识符常量的声明方式
1. 宏定义(#define) —— 属于预处理器指令,需置于函数外部。
#define MAX_SIZE 100
2. const 关键字(C99标准引入) —— 编译时进行类型检查,作用域更灵活。
const int MAX_VALUE = 200;
两种方式对比
| 特性 | const | #define |
|---|---|---|
| 类型检查 | 有 | 无 |
| 处理阶段 | 编译期 | 预处理阶段 |
| 内存分配 | 在内存中创建 | 文本替换 |
进制系统与转换
常见进制表示
- 十进制(DEC):默认表示方式,如
123。 - 二进制(BIN):以
0b开头,如0b1010。 - 十六进制(HEX):以
0x开头,如0xFF。
输出格式控制符
| 占位符 | 含义 |
|---|---|
| %d | 十进制整数 |
| %x | 小写十六进制 |
| %#x | 带前缀 0x 的十六进制 |
| %#X | 带前缀 0X 的十六进制 |
进制转换规则
- 其他进制转十进制:从最低位开始,每位乘以基数的幂次,求和。
- 十进制转其他进制:不断除以目标基数,取余数并倒序排列。
快速转换法:八四二一法则
用于二进制与十六进制之间的快速互换,每4位二进制对应1位十六进制。
1111 → 15 → F
1010 → 10 → A
数值的内部编码:原码、反码、补码
计算机中负数以补码形式存储。
- 正数与零:原码 = 反码 = 补码。
- 负数:
- 原码:符号位为1,其余位为绝对值的二进制。
- 反码:符号位不变,其余位取反。
- 补码:反码加1。
数据类型详解
整数类型
| 类型 | 长度(字节) | 说明 |
|---|---|---|
| short int | 2 | 可省略 signed |
| int | 4 | 默认为有符号 |
| long int | 4/8 | 视平台而定 |
| long long int | 8 | 固定8字节 |
后缀与占位符
字面量后缀用于指定类型:
100U // unsigned int
100L // long
100LL // long long
格式化输出占位符:
| 类型 | 占位符 |
|---|---|
| int | %d |
| unsigned int | %u |
| short | %hd |
| long long | %lld |
等宽整数类型(stdint.h)
提升跨平台兼容性:
int8_t n1 = 100; // 8位有符号整数
uint8_t n2 = 255; // 8位无符号整数
int32_t n3 = -1000; // 32位有符号整数
uint64_t n4 = 1ULL; // 64位无符号整数
浮点类型
| 类型 | 长度 | 有效位数 |
|---|---|---|
| float | 4 | 6~9 |
| double | 8 | 15~18 |
| long double | 10~16 | 18+ |
浮点数输出默认保留6位小数,可通过格式控制修改:
printf("value: %.2f\n", x); // 显示两位小数
科学计数法与格式符
double val = 5.2e2; // 等价于 5.2 × 10²
// 输出格式
%f // 十进制形式
%e // 科学计数法(如 3.211000e-4)
字符类型(char)
本质是单字节整数,支持有符号与无符号版本。
- 字面量用单引号:
'a'、'\n'。 - 转义序列示例:
\n:换行\':单引号\\:反斜杠\t:制表符
- ASCII码范围:0~127(7位二进制),共128个字符。
- 存储过程:字符 → ASCII码值 → 二进制存储。
ASCII与字符映射
A → 65, a → 97, '0' → 48
布尔类型(bool)
在 C99 中引入,支持真/假逻辑。
- C89:使用宏定义
#define TRUE 1。 - C99:
- 添加
_Bool类型。 - 通过
<stdbool.h>使用bool、true、false。
- 添加
逻辑值规则:0 为假,非零即为真。