• 1
  • 0
  • 0
  • C语言基础入门笔记(第二部分扩展):整数类型、进制与数据存储原理

  • 孤寂Solitude
  • 1,360
  • 2026-04-30 01:54
  • 本文内容:计算机为什么用二进制,以及如何用二进制存储文字、图片、声音、视频。整数的二进制/八进制/十六进制表示及相互转换。四种整数类型(short/int/long/long long)的内存占用、取值范围。sizeof 运算符的使用。常见误区与代码风格建议。

    一、为什么计算机用二进制?

    计算机内部由无数个晶体管组成,它们就像一个个微小的开关,只有“开”(通电)和“关”(断电)两种状态。
    这两种状态天然对应二进制的 10

    所有数据 —— 数字、文字、图片、声音、视频 —— 最终都会被转换成 0 和 1 的序列存储在计算机中。

    1.1 二进制的基本原理

    • 一位二进制(一个 bit)只能表示两个值:0 或 1。
    • 把多个 bit 组合起来,就能表示更多状态。例如 8 个 bit(1 字节)可以表示 2⁸ = 256 种不同的值。
    • 计算机中所有数据都是用 bit 序列 存储的,只是解释方式不同:同一串二进制数,按“整数规则”解读是数字,按“ASCII 规则”解读是字符,按“像素规则”解读就是颜色。

    1.2 计算机如何存储文字 —— 给每个字符一个编号

    计算机不能直接存储字母或汉字,只能存储数字。因此我们需要一张 编码表(字符集),为每个字符分配一个唯一的编号(码点),存储时存编号,显示时根据编号画出字形。

    ① ASCII 码(美国信息交换标准代码)

    • 用 1 个字节(8 位)表示一个字符,总共 256 个。
    • 包括:英文字母(大小写)、数字 0~9、标点符号、控制字符(换行、回车等)。
    • 例如:大写字母 A 的 ASCII 码是 65(二进制 01000001)。
    字符十进制二进制 (8位)
    A6501000001
    B6601000010
    C6701000011
    a9701100001
    b9801100010
    c9901100011
    04800110000
    14900110001
    25000110010

    ② 中文编码:GB2312、GBK

    • ASCII 的 256 个字符放不下数千个汉字,因此中国制定了 GB2312(约 7000 个汉字)及其扩展 GBK(2 万多个汉字和符号)。
    • GBK 使用 1 个或 2 个字节 表示一个字符:英文字母和 ASCII 一样用 1 字节,汉字用 2 字节。
    • 例如:汉字 中 的 GBK 编码可能是 0xD6 0xD0(两个字节)。

    ③ 国际统一标准:Unicode 与 UTF-8

    • Unicode 给全世界所有字符(包括 emoji 😊)分配一个唯一的码点(如 U+0041 表示 A,U+4E2D 表示 中)。
    • UTF-8 是一种可变长的存储方式,把 Unicode 码点转换成 1~4 个字节:英文字母 → 1 字节(与 ASCII 兼容)汉字 → 通常 3 字节emoji → 4 字节
    • 现代编程(包括 C 语言)普遍使用 UTF-8 处理文本。

    总结文字存储

    文字存储就是查码表。计算机里存的是二进制编号,显示时根据字体引擎把编号画成可见字形。

    1.3 计算机如何存储图片 —— 分割成像素

    一张图片由无数个极小的 像素(pixel)组成。每个像素用若干 bit 表示颜色。

    ① 黑白图片(灰度图)

    • 每个像素只需 1 个字节(0~255):0 表示纯黑,255 表示纯白,中间值表示不同深浅的灰色。
    • 图片大小(字节)= 宽度 × 高度(像素数)。例如一张 100×100 的灰度图需要 10,000 字节。


    ② 彩色图片(RGB 模式)

    • 每个像素用 3 个字节 表示:分别代表红(R)、绿(G)、蓝(B)的强度,每个分量范围 0~255。
    • 颜色组合示例:R=255, G=0, B=0 → 纯红R=0, G=255, B=0 → 纯绿R=255, G=255, B=255 → 白色R=0, G=0, B=0 → 黑色
    • 常见高清图(1920×1080)原始 RGB 大小 = 1920×1080×3 ≈ 5.9 MB。实际存储会用 JPEG、PNG 等压缩格式大幅减小体积。

    总结图片存储

    图片存储 = 按像素网格记录每个像素的颜色值(二进制)。像素越密、颜色深度越大,图片越清晰,文件也越大。

    1.4 计算机如何存储声音 —— 采样与量化

    声音本质是 声波(空气压强的连续变化)。计算机无法直接存储连续波形,而是 每隔很短时间测一次声波的振幅,并记录下来。这个过程叫做 采样

    ① 采样率(Sample Rate)

    • 每秒采样的次数,单位 Hz(赫兹)。
    • 常见 CD 音质:44,100 次/秒(44.1 kHz)。理论依据:要完整记录 20kHz 以下的声波,采样率需大于 40kHz。

    ② 量化位数(Bit Depth)

    • 每次记录振幅时,用多少个二进制位来表示这个振幅值。
    • 常用 16 位:可以表示 2¹⁶ = 65,536 个不同振幅(范围 -32768 ~ 32767)。

    ③ 声音文件大小计算

    • 单声道 1 秒大小 = 采样率 × 量化位数字节数例如 44,100 × 2 字节 = 88,200 字节 ≈ 86.1 KB。
    • 立体声(双声道)则乘以 2:176.4 KB/秒。一首 3 分钟的歌曲 ≈ 176.4 × 180 ≈ 31.7 MB(未压缩)。实际 MP3 等有损压缩可缩小到 1/10 左右。
    为什么声音能用二进制存?因为振幅被离散化成了整数,计算机只需要存储这一串整数(二进制形式),播放时把整数转换回电压推动喇叭,就能大致还原原声。

    1.5 视频 —— 图片 + 声音 + 时间

    • 视频就是一连串快速播放的图片(称为“帧”),每秒播放的帧数叫 帧率(fps),常见 24、30、60 fps。
    • 每一帧就是一张图片(通常压缩格式如 JPEG、HEVC),再配上同步的声音轨道。
    • 原始视频巨大,必须使用复杂压缩算法(H.264、H.265 等)才能存储和传输。

    1.6 数据存储总结表

    数据类型数字化方法核心概念
    文字查码表(ASCII、GBK、Unicode / UTF-8)字符 → 编号
    图片分割成像素,记录每个像素的颜色值像素 → RGB / 灰度
    声音对声波定时采样,记录振幅值采样率、量化位数
    视频连续图片(帧) + 同步声音帧率、压缩算法

    二、整数的四种进制写法

    C 语言允许我们直接在代码中写二进制、八进制、十六进制常量,编译器会自动转换成十进制数存储。

    进制前缀数字范围示例对应的十进制
    二进制0b0B0,10b101010
    八进制0(数字零)0~701210
    十六进制0x0X0~9, a~f0xA10

    2.1 二进制(Binary)

    int a = 0b1010;  // 二进制 1010 = 8+2 = 10
    printf("%d\n", a); // 输出 10
    • 只有 0 和 1,每左移一位相当于乘 2。
    • 注意:0b 前缀不是标准 C(GCC/Clang 支持),可移植代码建议用十六进制代替。

    2.2 八进制(Octal)

    int b = 012;    // 八进制 12 = 1×8 + 2 = 10
    printf("%d\n", b); // 输出 10
    • 最容易踩坑:int time = 0700; 不是 700,而是 7×64 = 448。
    • 建议:除了 Linux 权限设置(chmod 0755),平时少用八进制。

    2.3 十六进制(Hexadecimal)

    int c = 0xA;    // 十六进制 A = 10
    int d = 0x10;   // 0x10 = 16(不是10!)
    printf("%d %d\n", c, d); // 输出 10 16
    • 字母 a~f 不区分大小写,0x1f 和 0x1F 一样。
    • 十六进制和二进制转换极其方便:1 位十六进制 = 4 位二进制。

    三、进制转换详解

    3.1 二进制转十进制

    方法:按位权相加。位权从右往左依次是 2⁰, 2¹, 2², 2³, …

    例子:0b1011
    计算:1×2³ + 0×2² + 1×2¹ + 1×2⁰ = 8 + 0 + 2 + 1 = 11

    快速法:8421 法(适合 4 位以内)

    记住二进制从右到左的权重:8 4 2 1。
    例如 1101 = 8+4+0+1 = 13。

    3.2 十进制转二进制

    方法:除 2 取余一直除到商0为止,倒序排列。

    例子:13 转二进制
    13 ÷ 2 = 6 余 1
    6 ÷ 2 = 3 余 0
    3 ÷ 2 = 1 余 1
    1 ÷ 2 = 0 余 1
    从下往上读:1101

    3.3 八进制/十六进制转二进制

    • 八进制 ↔ 二进制:1 位八进制拆成 3 位二进制。0o7 = 111,0o3 = 011(高位补 0)。
    • 十六进制 ↔ 二进制:1 位十六进制拆成 4 位二进制。0xF = 1111,0x3 = 0011。

    3.4任何数转十进制公式:系数*基数的权次幂相加


    四、整数类型(short / int / long / long long)

    4.1 内存大小与取值范围

    类型典型大小取值范围(有符号)占位符
    short2 字节-32,768 ~ 32,767%hd
    int4 字节-2,147,483,648 ~ 2,147,483,647%d
    longWindows 4 字节;Linux 64 位 8 字节依系统%ld
    long long8 字节-9.22×10¹⁸ ~ 9.22×10¹⁸%lld

    4.2 为什么范围有负数?

    因为默认整数类型是 有符号数(signed),最高位(最左边一位)被用来表示正负:0 为正,1 为负。

    • 如果你确定数字不会是负数,可以用 unsigned 类型,范围翻倍(例如 unsigned int 范围 0 ~ 4,294,967,295)。

    4.3 类型选择建议

    • 一般用 int:平衡范围与内存,CPU 处理速度最快。
    • 大数(超过 21 亿):用 long long。
    • 节省内存(大数组):用 short 或 unsigned short。
    • 存储内存地址/大小:用 size_t(实际上是无符号整数)。

    五、sizeof 运算符 —— 测量内存大小

    sizeof 可以测类型或变量占用的字节数。

    printf("short: %zu\n", sizeof(short));   // 2
    printf("int: %zu\n", sizeof(int));       // 4
    printf("long: %zu\n", sizeof(long));     // 4 或 8
    printf("long long: %zu\n", sizeof(long long)); // 8
    
    int x;
    printf("x 的大小: %zu\n", sizeof(x));    // 和 sizeof(int) 一样

    sizeof 的常见用途

    ① 计算数组元素个数

    int arr[10];
    int len = sizeof(arr) / sizeof(arr[0]);  // 10

    ② 动态内存分配

    malloc(10 * sizeof(int));  // 申请 40 字节

    六、常见错误与误区

    错误现象原因正确写法
    int a = 010; 以为是 10,结果是 8前导 0 表示八进制想写 10 就直接写 10
    printf("%d", 0x10); 以为是 10不熟悉十六进制记住 0x10 = 16
    short s = 50000; 输出负数超出范围(溢出)改用 int
    printf("%d", long_var); 警告占位符与类型不匹配long%ldlong long%lld
    sizeof 写成 sizeof int 不加括号对变量可以不加括号,但对类型必须加sizeof(int)sizeof x

    七、补充:无符号类型与补码(进阶了解)

    • 无符号类型:所有位都用来表示数值,范围只包含正数和 0。写法 unsigned int u = 100;,占位符用 %u。
    • 有符号数的存储:计算机内部使用 补码(two‘s complement) 表示负数。优点是正负数加法统一,且范围对称:负数绝对值比正数多 1 个(例如 8 位有符号范围 -128 ~ 127)。
    • 初学者暂不深究补码细节,但要知道:溢出后结果会“环绕”。

    八、总结与记忆图

    一句话记忆口诀

    整数类型有四种,short int long 和 long long。进制前缀记清楚:0b 二进制,0 开头八进制,0x 十六进制。sizeof 测字节,范围匹配不溢出。无符号用 %u,有符号用 %d,long 对应 %ld,long long 用 %lld。

    已学知识结构图

    二进制基本原理 ──┬── 数据存储(文字/图片/声音/视频)
                    ├── 进制写法(二、八、十六)
                    ├── 进制转换(权相加、除2取余)
                    ├── 整数类型(short/int/long/long long)
                    ├── sizeof 运算符
                    └── 常见误区(溢出、前缀混淆、占位符错误)


    九、下一步学习

    • 浮点数(float / double)的存储与精度问题(IEEE 754)
    • 字符与字符串(char、ASCII 码、转义字符)
    • 输入函数 scanf 配合不同格式符
    • 运算符优先级与类型转换

    评论

  • 0
    /1000
    最热
  • 最新

    确认跳转

    您即将离开当前页面,访问外部链接。请注意核对网址,保护隐私安全。

    https://example.com

    言心安全助手 · 建议确认来源可信

    • 0
    • 0
    • 1
    登录后参与评论