
常量类型 | 示例 | 说明 | 注意事项 |
|---|---|---|---|
整型常量 | 10、-5、0 | 普通的整数 | 默认是int类型 |
长整型常量 | 10L、-5l | 后面加L或l | 推荐用大写L,避免和数字1混淆 |
无符号整型常量 | 10U、5u | 后面加U或u | 表示非负数 |
八进制常量 | 012、077 | 以0开头 | 012 = 十进制10 |
十六进制常量 | 0xA、0xFF | 以0x开头 | 0xA = 十进制10 |
浮点型常量 | 3.14、-0.5 | 带小数点的数 | 默认是double类型 |
科学计数法 | 1.2e3 | e代表10的次方 | 1.2e3 = 1200 |
字符常量 | 'A'、'9'、'\n' | 用单引号括起来 | 只能是一个字符 |
字符串常量 | "Hello"、"C语言" | 用双引号括起来 | 可以包含多个字符 |
符号常量 | #define PI 3.14 | 用标识符代表一个常量 | 预编译时替换 |
转义字符 | 含义 | ASCII码值 |
|---|---|---|
'\n' | 换行 | 10 |
'\t' | 水平制表符(Tab) | 9 |
'\r' | 回车 | 13 |
'\\' | 反斜杠 \ | 92 |
'\'' | 单引号 | 39 |
'\"' | 双引号 | 34 |
'\0' | 空字符(字符串结束标志) | 0 |
#define 预处理(宏定义)c
#include <stdio.h>
// 定义常量(一般大写,方便区分)
#define PRICE 98.5
#define PI 3.14159
#define MAX_STUDENTS 50
#define COURSE_NAME "C语言程序设计"
int main() {
// 使用常量
printf("课程:%s\n", COURSE_NAME);
printf("价格:%.2f 元\n", PRICE);
printf("圆周率:%f\n", PI);
printf("最多学生数:%d\n", MAX_STUDENTS);
// PRICE = 100; // 错误!不能修改
return 0;
}const 关键字c
#include <stdio.h>
int main() {
// 定义常量(const修饰的变量就是常量)
const double PI = 3.14159;
const int DAYS_OF_WEEK = 7;
const char GRADE = 'A';
// 使用常量
printf("圆周率:%f\n", PI);
printf("一周有 %d 天\n", DAYS_OF_WEEK);
printf("成绩:%c\n", GRADE);
// PI = 3.14; // 错误!const常量不能修改
return 0;
}#define 和 const 的区别(初学者要知道)对比项 | #define | const |
|---|---|---|
本质 | 宏定义,预编译时替换 | 修饰的变量,是常量 |
内存 | 不分配内存 | 分配内存 |
类型检查 | 无类型,只是文本替换 | 有具体类型,编译时会检查 |
作用域 | 从定义到文件结束 | 遵循变量的作用域规则 |
调试 | 不能调试 | 可以调试 |
推荐用法 | 简单的数值常量 | 有类型的常量 |
c
#include <stdio.h>
// 定义符号常量
#define TAX_RATE 0.06
#define STUDENT_NUM 5
int main() {
// const常量
const double PRICE_PER_BOOK = 45.5;
// 变量
double total;
int count = 3;
// 计算总价
total = count * PRICE_PER_BOOK * (1 + TAX_RATE);
printf("买了 %d 本书\n", count);
printf("单价:%.2f 元\n", PRICE_PER_BOOK);
printf("税率:%.0f%%\n", TAX_RATE * 100);
printf("总价:%.2f 元\n", total);
// 字符常量的使用
char c1 = 'A';
char c2 = '\n'; // 转义字符
char c3 = '\t'; // Tab
printf("字符常量测试:%c%c前面有个Tab%c结束", c1, c2, c3);
return 0;
}字符串常量误用单引号
c
char name = 'Tom'; // 错误!字符常量不能放多个字符
char name[] = "Tom"; // 正确!字符串要用双引号和数组忘记转义字符
c
printf("C:\name"); // 错误!\n被解释成换行
printf("C:\\name"); // 正确!\\表示一个反斜杠尝试修改常量
c
#define MAX 100
MAX = 200; // 错误!不能修改常量
const int MIN = 0;
MIN = -10; // 错误!不能修改const常量七、总结
#define、const
\开头的特殊字符
#define,有明确类型的用const
进制类型 | 表示方法 | 示例 | 十进制值 | 适用场景 |
|---|---|---|---|---|
十进制 | 直接写数字(0-9) | 123 | 123 | 日常计数 |
-45 | -45 | |||
0 | 0 | |||
八进制 | 以 0 开头(0-7) | 0123 | 83 | 文件权限(Linux/Unix) |
0777 | 511 | |||
010 | 8 | |||
十六进制 | 以 0x 或 0X 开头 | 0x123 | 291 | 内存地址、颜色值 |
(0-9, A-F/a-f) | 0xFF | 255 | ||
0xA5 | 165 | |||
0x10 | 16 | |||
二进制 | C标准不支持直接写 | (需要借助其他方式) | — | 位运算(用十六进制代替) |
c
#include <stdio.h>
int main() {
int a = 100; // 十进制
int b = 0144; // 八进制 (1*64 + 4*8 + 4 = 100)
int c = 0x64; // 十六进制 (6*16 + 4 = 100)
printf("十进制: %d\n", a); // 输出: 100
printf("八进制: %o\n", a); // 输出: 144
printf("十六进制: %x\n", a); // 输出: 64
return 0;
}后缀 | 含义 | 示例 | 说明 |
|---|---|---|---|
无后缀 | int | 123 | 默认是int类型 |
U / u | unsigned int | 123U、45u | 无符号整型 |
L / l | long | 123L、45l | 长整型(推荐用大写L) |
UL / ul | unsigned long | 123UL、45ul | 无符号长整型 |
LL / ll | long long | 123LL、45ll | 长长整型(C99标准) |
ULL / ull | unsigned long long | 123ULL | 无符号长长整型 |
c
#include <stdio.h>
int main() {
int a = 100; // int类型
long b = 100L; // long类型
long long c = 100LL; // long long类型
unsigned int d = 100U; // unsigned int类型
printf("a的大小: %llu 字节\n", sizeof(a)); // 4
printf("b的大小: %llu 字节\n", sizeof(b)); // 4或8
printf("c的大小: %llu 字节\n", sizeof(c)); // 8
printf("d的大小: %llu 字节\n", sizeof(d)); // 4
return 0;
}表示方式 | 说明 | 示例 | 十进制值 | 类型 |
|---|---|---|---|---|
小数形式 | 必须有小数点 | 3.14 | 3.14 | double |
.5 | 0.5 | double | ||
-2. | -2.0 | double | ||
指数形式 | 用e或E表示10的幂 | 1.2e3 | 1200 | double |
2.5e-2 | 0.025 | double | ||
1E6 | 1000000 | double | ||
float类型 | 加F/f后缀 | 3.14F | 3.14 | float |
2.5e-2f | 0.025 | float | ||
long double | 加L/l后缀 | 3.14L | 3.14 | long double |
c
#include <stdio.h>
int main() {
double d1 = 3.14159; // double类型
double d2 = .123; // 0.123
double d3 = 5.; // 5.0
float f1 = 3.14F; // float类型
float f2 = 2.5e-3f; // 0.0025
// 科学计数法
double sun = 1.496e8; // 太阳距离:1.496*10^8 km
double electron = 1.6e-19; // 电子电量:1.6*10^-19 C
printf("圆周率:%f\n", d1);
printf("0.123 = %f\n", d2);
printf("5.0 = %f\n", d3);
printf("2.5e-3 = %f\n", f2);
printf("太阳距离:%e km\n", sun); // 科学计数法输出
printf("电子电量:%e C\n", electron);
return 0;
}常量类型 | 格式占位符 | 示例 | 输出示例 |
|---|---|---|---|
十进制int | %d | printf("%d", 123); | 123 |
八进制 | %o | printf("%o", 123); | 173 |
十六进制 | %x / %X | printf("%x", 123); | 7b |
无符号int | %u | printf("%u", 123U); | 123 |
long | %ld | printf("%ld", 123L); | 123 |
long long | %lld | printf("%lld", 123LL); | 123 |
float/double | %f | printf("%f", 3.14); | 3.140000 |
科学计数法 | %e | printf("%e", 3.14); | 3.140000e+00 |
自动选择 | %g | printf("%g", 3.14); | 3.14 |
c
#include <stdio.h>
int main() {
// 1. 整型常量 - 不同进制
printf("=== 进制表示 ===\n");
printf("十进制 100 = %d\n", 100);
printf("八进制 0144 = %d\n", 0144); // 100
printf("十六进制 0x64 = %d\n", 0x64); // 100
// 2. 整型常量 - 不同后缀
printf("\n=== 类型后缀 ===\n");
printf("int: %d\n", 100);
printf("long int: %ld\n", 100L);
printf("long long: %lld\n", 100LL);
printf("unsigned: %u\n", 100U);
// 3. 实型常量
printf("\n=== 实型常量 ===\n");
printf("小数形式: %f\n", 3.14159);
printf("小数形式(无整数部分): %f\n", .5);
printf("指数形式(大数): %e\n", 1.23e8);
printf("指数形式(小数): %e\n", 1.23e-4);
// 4. 各种类型的大小
printf("\n=== 占用字节 ===\n");
printf("100 的类型大小: %llu 字节\n", sizeof(100));
printf("100L 的类型大小: %llu 字节\n", sizeof(100L));
printf("100LL 的类型大小: %llu 字节\n", sizeof(100LL));
printf("3.14 的类型大小: %llu 字节\n", sizeof(3.14));
printf("3.14F 的类型大小: %llu 字节\n", sizeof(3.14F));
return 0;
}八进制和十进制的混淆
c
int a = 012; // 你以为的12,实际是10
printf("%d", a); // 输出10指数形式的写法错误
c
float f = 1.2e-3.5; // 错误!指数必须是整数
float f = 1.2e-3; // 正确忘记后缀导致溢出
c
long big = 4000000000; // 可能溢出(超出int范围)
long big = 4000000000L; // 正确,指定为long类型七、记忆要点
012)
0x1A)
100L)
3.14F)
int,小数是double
占位符 | 含义 | 示例 | 输出 |
|---|---|---|---|
%d | 十进制(decimal) | printf("%d", 100); | 100 |
%o | 八进制(octal) | printf("%o", 100); | 144 |
%x | 十六进制小写(hexadecimal) | printf("%x", 100); | 64 |
%X | 十六进制大写 | printf("%X", 100); | 64 |
%#o | 带前缀的八进制 | printf("%#o", 100); | 0144 |
%#x | 带前缀的十六进制 | printf("%#x", 100); | 0x64 |
记忆技巧
对比项 | 普通字符常量 | 转义字符常量 |
|---|---|---|
定义 | 直接用单引号括起来的单个字符 | 以反斜杠\开头的特殊字符序列 |
示例 | 'A'、'9'、'?' | '\n'、'\t'、'\\' |
含义 | 字符本身 | 代表特殊的控制字符或符号 |
ASCII值 | 字符对应的ASCII码 | 也有对应的ASCII码 |
可见性 | 通常是可见字符 | 大多是不可见的控制字符 |
数量 | 95个可打印字符 | 十几个常用转义序列 |
类别 | 示例 | ASCII值(十进制) | 说明 |
|---|---|---|---|
大写字母 | 'A' 到 'Z' | 65-90 | 英文字母大写 |
小写字母 | 'a' 到 'z' | 97-122 | 英文字母小写 |
数字 | '0' 到 '9' | 48-57 | 数字字符,不是数值 |
标点符号 | ','、'.'、';' | 44、46、59 | 各种标点 |
特殊符号 | '@'、'#'、'$' | 64、35、36 | 键盘上的特殊符号 |
空格 | ' ' | 32 | 空格字符 |
转义字符 | 含义 | ASCII值(十进制) | 使用场景 |
|---|---|---|---|
'\n' | 换行(newline) | 10 | 光标移到下一行开头 |
'\t' | 水平制表符(tab) | 9 | 对齐文本,相当于按Tab键 |
'\r' | 回车(carriage return) | 13 | 光标回到本行开头 |
'\b' | 退格(backspace) | 8 | 光标后退一格 |
'\f' | 换页(form feed) | 12 | 打印机换页 |
'\a' | 响铃(alert/bell) | 7 | 发出"哔"的一声 |
'\v' | 垂直制表符 | 11 | 垂直方向跳格 |
'\0' | 空字符(null) | 0 | 字符串结束标志 |
'\\' | 反斜杠本身 | 92 | 输出一个\ |
'\'' | 单引号 | 39 | 输出一个单引号' |
'\"' | 双引号 | 34 | 输出一个双引号" |
'\?' | 问号 | 63 | 输出一个问号? |
'\ddd' | 八进制ASCII码 | ddd为八进制数 | 如'\101'代表'A' |
'\xhh' | 十六进制ASCII码 | hh为十六进制数 | 如'\x41'代表'A' |
区别点 | 普通字符常量 | 转义字符常量 |
|---|---|---|
写法 | 直接写字符 | 以\开头 |
可读性 | 直观易懂 | 需要记忆含义 |
键盘输入 | 可以直接敲出来 | 不能直接敲,用代码表示 |
控制功能 | 无控制功能 | 有控制功能(如换行) |
特殊符号 | 不能表示引号本身 | 可以表示特殊符号 |
c
// 错误1:普通字符常量不能表示换行
char c1 = ''; // 错误!空字符
char c2 = 'AB'; // 错误!只能一个字符
char c3 = '10'; // 错误!只能一个字符
// 正确写法
char c1 = '\0'; // 空字符
char c2 = 'A'; // 一个字符
char c3 = '1'; // 字符1
// 错误2:忘记转义
printf("C:\name"); // 错误!\n被解释成换行
printf("C:\\name"); // 正确!
// 错误3:字符串和字符混淆
char c4 = "A"; // 错误!"A"是字符串常量
char c5 = 'A'; // 正确!'A'是字符常量'A'到'Z'、'a'到'z'
'0'到'9'
'!'、'?'、'@'等
text
\n - newline(换行)
\t - tab(制表符)
\r - return(回车)
\b - backspace(退格)
\a - alarm(响铃)
\\ - 反斜杠
\' - 单引号
\" - 双引号
\0 - null(字符串结束标志)数据类型 | 16位系统 | 32位系统 | 64位系统 | Windows 64位 |
|---|---|---|---|---|
char | 1 | 1 | 1 | 1 |
short | 2 | 2 | 2 | 2 |
int | 2 | 4 | 4 | 4 |
long | 4 | 4 | 8 | 4(特殊) |
long long | 8 | 8 | 8 | 8 |
float | 4 | 4 | 4 | 4 |
double | 8 | 8 | 8 | 8 |
long double | 8-10 | 8-10 | 10-16 | 8 |
指针 | 2 | 4 | 8 | 8 |
数据类型 | 字节计算方式 | 示例 | 大小 |
|---|---|---|---|
数组 | 元素类型 × 元素个数 | int arr[10] | 4 × 10 = 40字节 |
结构体 | 各成员之和 + 内存对齐 | struct {char c; int i;} | 1+4+填充=8字节 |
联合体 | 最大成员的大小 | union {char c; int i;} | max(1,4) = 4字节 |
枚举 | 通常同int | enum color {RED, GREEN} | 4字节 |
指针 | 跟系统位数有关 | int *p | 4(32位)/8(64位) |
概念 | 英文 | 定义 | 类比理解 | 大小关系 |
|---|---|---|---|---|
比特 | bit | 计算机最小的存储单位,只能存0或1 | 就像一盏灯:开(1)或关(0) | 1 bit |
字节 | byte | 8个比特组成一个字节,基本存储单位 | 就像一个8位的二进制数 | 1 byte = 8 bits |
字 | word | 计算机一次能处理的二进制位数 | 就像一条数据通道的宽度 | 1 word = 16/32/64 bits |
字长 | word length | CPU一次能并行处理的位数 | 就像马路的车道数 | 跟CPU位数有关 |
半字 | half word | 字长的一半 | 如32位系统半字=16位 | |
双字 | double word | 字长的两倍 | 如32位系统双字=64位 |
数据类型 | 字节数 | 比特数 | 说明 |
|---|---|---|---|
char | 1字节 | 8位 | 最基本的字符单位 |
short | 2字节 | 16位 | 短整型 |
int | 4字节 | 32位 | 标准整型 |
long | 4/8字节 | 32/64位 | 取决于系统 |
long long | 8字节 | 64位 | 长长整型 |
float | 4字节 | 32位 | 单精度浮点 |
double | 8字节 | 64位 | 双精度浮点 |
指针 | 4/8字节 | 32/64位 | 跟系统位数走 |
系统位数 | 字长 | 字节 | 比特 | 特点 |
|---|---|---|---|---|
8位系统 | 1个字 = 8位 | 1字节 | 8位 | 早期单片机 |
16位系统 | 1个字 = 16位 | 2字节 | 16位 | 8086处理器 |
32位系统 | 1个字 = 32位 | 4字节 | 32位 | XP/Win7常见 |
64位系统 | 1个字 = 64位 | 8字节 | 64位 | 现在主流系统 |
text
【比特(bit)级别】
┌─────┐
│ 1 │ 一个比特:只能存0或1
└─────┘
【字节(byte)级别】
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│ 0 │ 1 │ 0 │ 0 │ 0 │ 0 │ 1 │ 1 │ 1字节 = 8比特
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
(最高位) (最低位)
【字(word)级别 - 32位系统】
┌─────────────────────────────────────────────────┐
│ 1个字 = 4字节 │
├─────────┬─────────┬─────────┬─────────┬─────────┤
│ 字节3 │ 字节2 │ 字节1 │ 字节0 │ │
│ (31-24) │ (23-16) │ (15-8) │ (7-0) │ │
└─────────┴─────────┴─────────┴─────────┴─────────┘单位 | 字节 | 比特 | 大概容量 |
|---|---|---|---|
1比特 | 1/8字节 | 1 bit | 一个开关状态 |
1字节 | 1 byte | 8 bits | 一个英文字母 |
1千字节(KB) | 1024字节 | 8192 bits | 一篇短文 |
1兆字节(MB) | 1024 KB | 约8百万 bits | 一张照片 |
1千兆字节(GB) | 1024 MB | 约80亿 bits | 一部电影 |
1太字节(TB) | 1024 GB | 约8万亿 bits | 整个硬盘 |
数据类型 | 位数 | 最大值(二进制) | 最大值(十进制) | 理解方式 |
|---|---|---|---|---|
1 bit | 1位 | 1 | 1 | 只能存0或1 |
4 bits | 4位 | 1111 | 15 | 半个字节(nibble) |
1字节 | 8位 | 11111111 | 255 | 一个ASCII字符 |
2字节 | 16位 | 11111111 11111111 | 65,535 | 一个short |
4字节 | 32位 | 32个1 | 约42.9亿 | 一个int/float |
8字节 | 64位 | 64个1 | 约1.8×10¹⁹ | 一个double |
text
【层次关系】
┌─────────────────┐
│ 1个字 │
│ (word) │
├─────────────────┤
┌────────────────────┼─────────────────┼────────────────────┐
│ 1字节(byte) │ 1字节 │ 1字节 │
├────────────────────┼─────────────────┼────────────────────┤
┌────┬────┼────┬────┬────┬────┼────┬────┬────┬──┼──┬────┬────┬────┬──┐
│bit7│bit6│bit5│bit4│bit3│bit2│bit1│bit0│bit7│... │
└────┴────┴────┴────┴────┴────┴────┴────┴────┴──┴──┴────┴────┴────┴──┘
1字节 = 8比特
1字 = CPU位宽(如32位系统1字=32比特=4字节)
1双字 = 2字比特就是二进制,0和1来组成字。 八位组成一字节,存储基本单位是。 字长要看CPU,一次处理多少位。 十六三十二和六四,位数越高越快。 地址总线定上限,内存最大能多少。 指针大小随系统,三十二位四字节, 六十四位八字节,这些都是基础识。
特点 | 二进制 | 十进制 | 为什么选择二进制 |
|---|---|---|---|
物理实现 | 开/关、高/低电压 | 需要10种不同电压 | 二进制最简单、最可靠 |
电路设计 | 晶体管导通/截止 | 电路复杂难实现 | 二进制电路成本低 |
抗干扰 | 只有两种状态 | 容易误判 | 二进制更稳定 |
运算规则 | 简单(0+0=0等) | 复杂(九九乘法表) | 二进制运算快 |
数据类型 | 二进制位数 | 能表示的状态数 | 计算公式 | 实际意义 |
|---|---|---|---|---|
1 bit | 1位 | 2种 | 2¹ = 2 | 0或1 |
char | 8位 | 256种 | 2⁸ = 256 | 可存所有ASCII字符 |
short | 16位 | 65,536种 | 2¹⁶ = 65,536 | 可存0~65535 |
int | 32位 | 约42.9亿种 | 2³² ≈ 4.29×10⁹ | 可存约42.9亿个数 |
long long | 64位 | 约1.84×10¹⁹种 | 2⁶⁴ ≈ 1.84×10¹⁹ | 天文数字 |
c
#include <stdio.h>
int main() {
// 以char为例(1字节 = 8位二进制)
printf("=== 8位二进制能表示的数 ===\n");
// 无符号char:8位全是数值位
unsigned char uc = 0;
printf("最小(全0): 00000000 = %d\n", uc);
uc = 255; // 11111111
printf("最大(全1): 11111111 = %d\n", uc);
printf("无符号char范围: 0 ~ 255 (2⁸-1)\n\n");
// 有符号char:最高位是符号位(0正1负)
signed char sc = -128; // 10000000
printf("最小: 10000000 = %d\n", sc);
sc = 127; // 01111111
printf("最大: 01111111 = %d\n", sc);
printf("有符号char范围: -128 ~ 127\n");
printf("\n=== 二进制与最大值的关系 ===\n");
printf("8位全1 = 2⁸ - 1 = %d\n", (1<<8)-1);
printf("16位全1 = 2¹⁶ - 1 = %d\n", (1<<16)-1);
printf("32位全1 = 2³² - 1 = %u\n", (unsigned)-1);
return 0;
}text
【内存中的一个int变量(4字节=32位)】
数值:123456789 的二进制表示:
内存地址:0x1000
┌─────────────────────────────────────────────────┐
│ 高位字节 │ 低位字节 │
│ 00000111 │ 01011011 │ 11001101 │ 00010101 │
│ (0x07) │ (0x5B) │ (0xCD) │ (0x15) │
└─────────────────────────────────────────────────┘
bit31 bit23 bit15 bit7 bit0
每个bit的位置:
bit31 bit30 ... bit2 bit1 bit0
0 0 1 0 1概念 | 二进制解释 | 图示 |
|---|---|---|
比特(bit) | 一个二进制位 | 0 或 1 |
字节(byte) | 8个二进制位 | 10101010(8位) |
半字 | 16个二进制位 | 10101010 10101010(16位) |
字 | CPU位数个二进制位 | 32位系统:32个二进制位 |
内存地址 | 二进制编号 | 如:00000000到11111111 |
c
#include <stdio.h>
#include <math.h>
int main() {
printf("=== 二进制位数与数据范围 ===\n");
printf("------------------------------------------------\n");
printf("位数\t状态数\t\t数据类型\t范围\n");
printf("------------------------------------------------\n");
printf("1位\t2\t\tbit\t\t0~1\n");
printf("4位\t16\t\tnibble\t\t0~15\n");
printf("8位\t256\t\tchar\t\t0~255 或 -128~127\n");
printf("16位\t65536\t\tshort\t\t0~65535 或 -32768~32767\n");
printf("32位\t%.0f\tint\t\t0~%.0f\n",
pow(2,32), pow(2,32)-1);
printf("64位\t%.0f\tlong long\t0~%.0f\n",
pow(2,64), pow(2,64)-1);
// 演示二进制位如何决定范围
printf("\n=== 二进制位计算 ===\n");
int bits = 8;
printf("%d位无符号整数范围: 0 ~ %u\n", bits, (unsigned)(1<<bits) - 1);
printf("%d位有符号整数范围: -%d ~ %d\n",
bits, 1<<(bits-1), (1<<(bits-1))-1);
return 0;
}二进制 | 十进制 | 十六进制 | 常用于 |
|---|---|---|---|
0000 | 0 | 0x0 | 4位一组 |
0001 | 1 | 0x1 | 方便查看二进制 |
0010 | 2 | 0x2 | 内存地址 |
0100 | 4 | 0x4 | 权限位 |
1000 | 8 | 0x8 | 标志位 |
1111 | 15 | 0xF | 4位全1 |
11111111 | 255 | 0xFF | 1字节全1 |
11111111 11111111 | 65535 | 0xFFFF | 2字节全1 |
c
#include <stdio.h>
// 打印整数的二进制表示
void print_binary(unsigned int num, int bits) {
printf("二进制(");
for(int i = bits-1; i >= 0; i--) {
printf("%d", (num >> i) & 1);
if(i % 4 == 0 && i != 0) printf(" "); // 每4位加空格
}
printf(")");
}
int main() {
int a = 42;
char c = 'A';
printf("=== 二进制视角看数据 ===\n\n");
// 数字42的二进制
printf("数字 %d 的存储:\n", a);
printf("十进制:%d\n", a);
printf("十六进制:0x%X\n", a);
printf("二进制:");
for(int i = 31; i >= 0; i--) {
printf("%d", (a >> i) & 1);
if(i % 8 == 0 && i != 0) printf(" | "); // 字节分隔
}
printf("\n");
printf("占用:%d字节 = %d位\n\n", sizeof(a), sizeof(a)*8);
// 字符'A'的二进制
printf("字符 '%c' 的存储:\n", c);
printf("ASCII码:%d\n", c);
printf("二进制:");
for(int i = 7; i >= 0; i--) {
printf("%d", (c >> i) & 1);
if(i % 4 == 0 && i != 0) printf(" ");
}
printf("\n");
printf("占用:%d字节 = %d位\n", sizeof(c), sizeof(c)*8);
return 0;
}概念 | 二进制本质 | 现实意义 |
|---|---|---|
位(bit) | 一个二进制数字 | 最小存储单元 |
字节 | 8个二进制位 | 编址基本单位 |
数据类型 | 解释二进制的方式 | 告诉计算机如何解读这些位 |
范围 | 二进制位数的限制 | 能表示的最大最小值 |
内存地址 | 二进制编号 | 找到数据的位置 |
指针 | 存着地址的二进制 | 指向另一个数据的位组合 |
c
#include <stdio.h>
int main() {
// 1. 为什么char只有256种可能?
printf("1字节 = 8位二进制\n");
printf("8位二进制所有可能组合:\n");
printf("最小:00000000\n");
printf("最大:11111111\n");
printf("组合数 = 2⁸ = 256种\n\n");
// 2. 为什么会有溢出?
unsigned char uc = 255; // 11111111
printf("uchar最大值255:11111111\n");
uc = uc + 1; // 100000000(9位,只能存低8位)
printf("255 + 1 = %d(实际变成了00000000)\n", uc);
printf("原因:只能存8位,高位丢失\n\n");
// 3. 为什么有符号和无符号范围不同?
printf("有符号char:最高位是符号位\n");
printf("01111111 = +127\n");
printf("10000000 = -128(补码表示)\n");
printf("范围:-128 ~ +127\n");
return 0;
}二进制就像计算机的母语,而数据类型就像是翻译规则:
理解了这个关系,你就明白了为什么:
这就是为什么我们说:计算机的一切都是二进制!

结语:如果对你有帮助,请点赞,关注,收藏,你的支持就是我最大的动力!