首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【绝对干货】C语言常量,变量,内存全方位总结:从入门到精通,这一篇就够了!

【绝对干货】C语言常量,变量,内存全方位总结:从入门到精通,这一篇就够了!

作者头像
北极的代码
发布2026-04-22 17:06:06
发布2026-04-22 17:06:06
1060
举报
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 预处理(宏定义)
代码语言:javascript
复制
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 关键字
代码语言:javascript
复制
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;
}
四、#defineconst 的区别(初学者要知道)

对比项

#define

const

本质

宏定义,预编译时替换

修饰的变量,是常量

内存

不分配内存

分配内存

类型检查

无类型,只是文本替换

有具体类型,编译时会检查

作用域

从定义到文件结束

遵循变量的作用域规则

调试

不能调试

可以调试

推荐用法

简单的数值常量

有类型的常量

五、常量的应用示例
代码语言:javascript
复制
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;
}
六、初学者常犯的错误

字符串常量误用单引号

代码语言:javascript
复制
c

char name = 'Tom';    // 错误!字符常量不能放多个字符
char name[] = "Tom";  // 正确!字符串要用双引号和数组

忘记转义字符

代码语言:javascript
复制
c

printf("C:\name");    // 错误!\n被解释成换行
printf("C:\\name");   // 正确!\\表示一个反斜杠

尝试修改常量

代码语言:javascript
复制
c

#define MAX 100
MAX = 200;            // 错误!不能修改常量

const int MIN = 0;
MIN = -10;            // 错误!不能修改const常量

七、总结

  • 常量:值不会改变的量
  • 表示方式:直接写值、#defineconst
  • 字符常量:单引号,一个字符
  • 字符串常量:双引号,多个字符
  • 转义字符\开头的特殊字符
  • 推荐:简单的数值用#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标准不支持直接写

(需要借助其他方式)

位运算(用十六进制代替)

进制转换示例
代码语言:javascript
复制
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

无符号长长整型

类型后缀示例
代码语言:javascript
复制
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

实型常量示例
代码语言:javascript
复制
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

五、综合示例:认识各种常量
代码语言:javascript
复制
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;
}

六、初学者常见问题

八进制和十进制的混淆

代码语言:javascript
复制
c

int a = 012;  // 你以为的12,实际是10
printf("%d", a);  // 输出10

指数形式的写法错误

代码语言:javascript
复制
c

float f = 1.2e-3.5;  // 错误!指数必须是整数
float f = 1.2e-3;    // 正确

忘记后缀导致溢出

代码语言:javascript
复制
c

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'

关键区别

区别点

普通字符常量

转义字符常量

写法

直接写字符

以\开头

可读性

直观易懂

需要记忆含义

键盘输入

可以直接敲出来

不能直接敲,用代码表示

控制功能

无控制功能

有控制功能(如换行)

特殊符号

不能表示引号本身

可以表示特殊符号

常见错误示例
代码语言:javascript
复制
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

代码语言:javascript
复制
\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

代码语言:javascript
复制
【比特(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

代码语言:javascript
复制
【层次关系】
                                   ┌─────────────────┐
                                   │    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¹⁹

天文数字

三、二进制如何决定取值范围
代码语言:javascript
复制
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

代码语言:javascript
复制
【内存中的一个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

六、二进制与数据类型范围的详细对照
代码语言:javascript
复制
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

八、实际应用:看二进制理解内存
代码语言:javascript
复制
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个二进制位

编址基本单位

数据类型

解释二进制的方式

告诉计算机如何解读这些位

范围

二进制位数的限制

能表示的最大最小值

内存地址

二进制编号

找到数据的位置

指针

存着地址的二进制

指向另一个数据的位组合

十、用二进制理解为什么会有这些限制
代码语言:javascript
复制
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;
}
总结

二进制就像计算机的母语,而数据类型就像是翻译规则

  1. 比特(bit) = 一个二进制数字
  2. 字节(byte) = 8个二进制数字的组合
  3. 数据类型 = 告诉计算机如何解读这些二进制数字
  4. 取值范围 = 二进制位数的数学限制
  5. 内存地址 = 二进制的位置编号

理解了这个关系,你就明白了为什么:

  • 1字节最大255(8位全1)
  • int最大约21亿(32位,1位作符号)
  • 64位系统能支持大内存(更多地址线)

这就是为什么我们说:计算机的一切都是二进制!

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-04-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、常量的类型
  • 二、转义字符(特殊的字符常量)
  • 三、常量的两种定义方式
    • 方式1:使用 #define 预处理(宏定义)
    • 方式2:使用 const 关键字
  • 四、#define 和 const 的区别(初学者要知道)
  • 五、常量的应用示例
  • 六、初学者常犯的错误
  • C语言常量详细总结(进制、类型、实型)
    • 一、整型常量的进制表示
      • 进制转换示例
    • 二、整型常量的类型后缀
      • 类型后缀示例
    • 三、实型常量(浮点型)
      • 实型常量示例
    • 四、各类型常量的格式占位符
    • 五、综合示例:认识各种常量
    • 六、初学者常见问题
    • 格式占位符总结
  • 普通字符常量 vs 转义字符常量
    • 一、基本概念对比
    • 二、详细表格对比
      • 1. 普通字符常量
      • 2. 转义字符常量
    • 关键区别
    • 常见错误示例
    • 记忆技巧
      • 普通字符常量记忆法:
      • 转义字符常量记忆法:
    • 不同系统的字节对比
    • 派生数据类型(取决于元素)
  • 计算机存储基础概念详解
    • 一、基本概念对比表
    • 二、各种数据类型占多少位(比特)
    • 三、不同系统的字长对比
    • 四、内存空间图解
    • 字节与比特的换算表
    • 七、不同类型能存的最大值
    • 位、字节、字的关系图
  • 二进制与计算机存储的深层联系
    • 一、为什么计算机用二进制?
    • 二、二进制与数据类型的本质关系
    • 三、二进制如何决定取值范围
    • 四、二进制在内存中的实际样子
    • 五、二进制与各概念的对应表
    • 六、二进制与数据类型范围的详细对照
    • 七、进制转换关系表
    • 八、实际应用:看二进制理解内存
    • 九、二进制与数据类型的关系总结表
    • 十、用二进制理解为什么会有这些限制
    • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档