

🔥个人主页:北极的代码(欢迎来访)
🎬作者简介:java后端学习者
✨命运的结局尽可永在,不屈的挑战却不可须臾或缺!
C语言常量总结
一、常量的类型
| 常量类型 | 示例 | 说明 | 注意事项 |
|---|---|---|---|
| 整型常量 | 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 |
三、常量的两种定义方式
方式1:使用 #define 预处理(宏定义)
cpp
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;
}
方式2:使用 const 关键字
cpp
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 |
|---|---|---|
| 本质 | 宏定义,预编译时替换 | 修饰的变量,是常量 |
| 内存 | 不分配内存 | 分配内存 |
| 类型检查 | 无类型,只是文本替换 | 有具体类型,编译时会检查 |
| 作用域 | 从定义到文件结束 | 遵循变量的作用域规则 |
| 调试 | 不能调试 | 可以调试 |
| 推荐用法 | 简单的数值常量 | 有类型的常量 |
五、常量的应用示例
cpp
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;
}
六、初学者常犯的错误
字符串常量误用单引号
cppc char name = 'Tom'; // 错误!字符常量不能放多个字符 char name[] = "Tom"; // 正确!字符串要用双引号和数组忘记转义字符
cppc printf("C:\name"); // 错误!\n被解释成换行 printf("C:\\name"); // 正确!\\表示一个反斜杠尝试修改常量
cppc #define MAX 100 MAX = 200; // 错误!不能修改常量 const int MIN = 0; MIN = -10; // 错误!不能修改const常量七、总结
常量:值不会改变的量
表示方式 :直接写值、
#define、const字符常量:单引号,一个字符
字符串常量:双引号,多个字符
转义字符 :以
\开头的特殊字符推荐 :简单的数值用
#define,有明确类型的用const
C语言常量详细总结(进制、类型、实型)
一、整型常量的进制表示
| 进制类型 | 表示方法 | 示例 | 十进制值 | 适用场景 |
|---|---|---|---|---|
| 十进制 | 直接写数字(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标准不支持直接写 | (需要借助其他方式) | --- | 位运算(用十六进制代替) |
进制转换示例
cppc #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 |
无符号长长整型 |
类型后缀示例
cpp
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 |
实型常量示例
cpp
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 |
五、综合示例:认识各种常量
cpp
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;
}
六、初学者常见问题
八进制和十进制的混淆
cppc int a = 012; // 你以为的12,实际是10 printf("%d", a); // 输出10指数形式的写法错误
cppc float f = 1.2e-3.5; // 错误!指数必须是整数 float f = 1.2e-3; // 正确忘记后缀导致溢出
cppc long big = 4000000000; // 可能溢出(超出int范围) long big = 4000000000L; // 正确,指定为long类型七、记忆要点
八进制 :数字0开头(如
012)十六进制 :0x开头(如
0x1A)long后缀 :大写L(如
100L)float后缀 :F/f(如
3.14F)指数形式:e代表10的多少次方
默认类型 :整数是
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 |
记忆技巧
%d :d 代表 decimal(十进制)
%o :o 代表 octal(八进制)
%x :x 代表 hexadecimal(十六进制)
普通字符常量 vs 转义字符常量
一、基本概念对比
| 对比项 | 普通字符常量 | 转义字符常量 |
|---|---|---|
| 定义 | 直接用单引号括起来的单个字符 | 以反斜杠\开头的特殊字符序列 |
| 示例 | 'A'、'9'、'?' |
'\n'、'\t'、'\\' |
| 含义 | 字符本身 | 代表特殊的控制字符或符号 |
| ASCII值 | 字符对应的ASCII码 | 也有对应的ASCII码 |
| 可见性 | 通常是可见字符 | 大多是不可见的控制字符 |
| 数量 | 95个可打印字符 | 十几个常用转义序列 |
二、详细表格对比
1. 普通字符常量
| 类别 | 示例 | ASCII值(十进制) | 说明 |
|---|---|---|---|
| 大写字母 | 'A' 到 'Z' |
65-90 | 英文字母大写 |
| 小写字母 | 'a' 到 'z' |
97-122 | 英文字母小写 |
| 数字 | '0' 到 '9' |
48-57 | 数字字符,不是数值 |
| 标点符号 | ','、'.'、';' |
44、46、59 | 各种标点 |
| 特殊符号 | '@'、'#'、'$' |
64、35、36 | 键盘上的特殊符号 |
| 空格 | ' ' |
32 | 空格字符 |
2. 转义字符常量
| 转义字符 | 含义 | 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' |
关键区别
| 区别点 | 普通字符常量 | 转义字符常量 |
|---|---|---|
| 写法 | 直接写字符 | 以\开头 |
| 可读性 | 直观易懂 | 需要记忆含义 |
| 键盘输入 | 可以直接敲出来 | 不能直接敲,用代码表示 |
| 控制功能 | 无控制功能 | 有控制功能(如换行) |
| 特殊符号 | 不能表示引号本身 | 可以表示特殊符号 |
常见错误示例
cpp
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¹⁹ | 天文数字 |
三、二进制如何决定取值范围
cpp
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 |
六、二进制与数据类型范围的详细对照
cpp
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 |
八、实际应用:看二进制理解内存
cpp
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个二进制位 | 编址基本单位 |
| 数据类型 | 解释二进制的方式 | 告诉计算机如何解读这些位 |
| 范围 | 二进制位数的限制 | 能表示的最大最小值 |
| 内存地址 | 二进制编号 | 找到数据的位置 |
| 指针 | 存着地址的二进制 | 指向另一个数据的位组合 |
十、用二进制理解为什么会有这些限制
cpp
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;
}
总结
二进制就像计算机的母语 ,而数据类型就像是翻译规则:
-
比特(bit) = 一个二进制数字
-
字节(byte) = 8个二进制数字的组合
-
数据类型 = 告诉计算机如何解读这些二进制数字
-
取值范围 = 二进制位数的数学限制
-
内存地址 = 二进制的位置编号
理解了这个关系,你就明白了为什么:
-
1字节最大255(8位全1)
-
int最大约21亿(32位,1位作符号)
-
64位系统能支持大内存(更多地址线)
这就是为什么我们说:计算机的一切都是二进制!

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