2.1 数据类型

本篇系统梳理整数、浮点、字符、布尔和 `void` 等基础类型,并能用 `sizeof` 和格式控制符正确观察它们。

数据类型

概念说明

数据类型决定了变量占用多少内存、能表示什么范围,以及编译器应该怎样解释那一段二进制数据。 同样的 4 个字节,如果按 int 看是整数,按 float 看则可能表示浮点数,类型不同,解释方式也完全不同。

C 的基础类型可以先按下面几组理解:

  • 整型:charshortintlonglong long
  • 浮点型:floatdoublelong double
  • 布尔型:_Bool,常配合 <stdbool.h> 中的 bool
  • 特殊类型:void

学类型时最重要的一点是区分“语言保证”和“平台常见现象”。 例如 char 一定是 1 字节,但 intlonglong double 的大小会因平台和编译器而不同。

语法/规则

  1. 整型可以搭配 signedunsigned 修饰,表示有符号或无符号整数。
  2. char 既可以表示字符,也是一种很小的整型,常用来存储单个字节。
  3. floatdoublelong double 用来表示小数,精度和范围通常逐步增加。
  4. void 表示“没有具体值”,常见于无返回值函数、无参数函数和通用指针 void *
  5. _Bool 是 C99 引入的布尔类型;如果想写成 bool,通常需要包含 <stdbool.h>
  6. sizeof(type)sizeof value 可以查看类型或对象占用的字节数,结果类型通常是 size_t
  7. 输出不同类型时,要尽量使用匹配的格式控制符,例如 %d%u%lld%f%c%zu

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <stdbool.h>
#include <stdio.h>

int main(void) {
    int count = 42;
    double price = 19.8;
    char grade = 'A';
    bool passed = true;

    printf("count = %d\n", count);
    printf("price = %.1f\n", price);
    printf("grade = %c\n", grade);
    printf("passed = %d\n", passed);
    printf("sizeof(int) = %zu\n", sizeof(int));
    printf("sizeof(double) = %zu\n", sizeof(double));
    return 0;
}

输出结果:

1
2
3
4
5
6
count = 42
price = 19.8
grade = A
passed = 1
sizeof(int) = 4
sizeof(double) = 8

sizeof(int)sizeof(double) 的结果在常见平台上经常分别是 48,但学习时仍然要记住: 某些类型大小并不是所有平台都完全固定。

常见错误

  1. 把不同平台上的类型大小当成绝对常识,例如默认认为 long 一定是 8 字节。
  2. 用错误的格式控制符输出数据,例如用 %d 输出 double 或用 %f 输出整数。
  3. 不区分 signedunsigned,在比较和运算时得到意外结果。
  4. char 只当字符看,忽略它本质上也是一个小整数类型。
  5. 看到 sizeof 的结果就直接硬编码进程序,而不是让代码根据类型自动计算字节数。
本文禁止转载
使用 Hugo 构建
主题 StackJimmy 设计 由 Hobin 魔改
最近构建时间:2026-04-17 19:07:48 CST
载入天数...载入时分秒...
发表了 1 篇文章 · 发表了 152 篇笔记 · 总计 18 万 0 千字