C语言基本数据类型

在编程中,数据类型决定了变量可以存储什么样的数据以及占用多少内存空间。 C语言提供了丰富的基本数据类型,包括整型、浮点型和字符型等。理解这些数据类型是编写高效、正确程序的基础。 本节将详细介绍C语言的基本数据类型及其特性。

📊 数据类型概述

C语言中的数据类型分为四大类:基本数据类型构造数据类型(如数组、结构体、共用体)、 指针类型空类型(void)。本章重点讲解基本数据类型,它们是构成更复杂数据的基础。

注意: C语言没有内置的字符串类型,字符串通常用字符数组表示,我们将在后续章节学习。

🔢 整型(Integer)

整型用于存储整数(不包含小数部分)。C语言提供多种整型,以适应不同范围的数值需求。 主要整型包括:

  • int —— 基本整型,通常占4个字节(32位),范围约 -2.1e9 ~ 2.1e9。
  • shortshort int —— 短整型,通常占2个字节,范围 -32768 ~ 32767。
  • longlong int —— 长整型,在32位系统通常占4字节,64位系统占8字节。
  • long long —— 长长整型,至少占8字节(C99标准引入)。

整型还可以配合 signed(有符号)和 unsigned(无符号)修饰符使用:

  • 有符号(默认):可存储正数、负数和0。
  • 无符号:只存储非负数,能表示的正数范围大约是同样大小有符号类型的两倍。

📏 整型大小与范围(常见平台)

类型 大小(字节) 有符号范围 无符号范围 格式说明符
short2-32,768 ~ 32,7670 ~ 65,535%hd / %hu
int4-2,147,483,648 ~ 2,147,483,6470 ~ 4,294,967,295%d / %u
long4 或 8*至少 -2,147,483,648 ~ 2,147,483,647至少 0 ~ 4,294,967,295%ld / %lu
long long8-9.2e18 ~ 9.2e180 ~ 1.8e19%lld / %llu

* 取决于系统和编译器,在64位Linux/macOS上 long 通常为8字节,Windows上为4字节。

💻 整型示例代码

#include <stdio.h>

int main() {
    int a = 100;
    short b = 2000;
    long c = 123456789L;      // L后缀表示long类型
    unsigned int d = 40000;   // 无符号整型

    printf("int: %d\n", a);
    printf("short: %hd\n", b);
    printf("long: %ld\n", c);
    printf("unsigned int: %u\n", d);

    // 使用sizeof查看类型占用的字节数
    printf("Size of int: %zu bytes\n", sizeof(int));
    printf("Size of short: %zu bytes\n", sizeof(short));
    printf("Size of long: %zu bytes\n", sizeof(long));
    printf("Size of long long: %zu bytes\n", sizeof(long long));

    return 0;
}
小提示: sizeof 是C语言运算符,用于计算数据类型或变量所占内存大小,返回 size_t 类型,通常用 %zu 格式输出。

🔤 字符型(char)

char 类型用于存储单个字符,如字母、数字、标点符号等。 实际上,字符在内存中是以其ASCII码(整数)存储的,因此 char 本质上也是一种整型。 它通常占1个字节(8位),可以存储 -128127(有符号)或 0255(无符号)的整数。

字符型示例代码

#include <stdio.h>

int main() {
    char ch = 'A';           // 字符常量用单引号
    char grade = 65;         // 65对应ASCII码 'A'
    unsigned char num = 200; // 无符号字符

    printf("ch = %c, ASCII = %d\n", ch, ch);
    printf("grade = %c, ASCII = %d\n", grade, grade);
    printf("num = %d\n", num);

    return 0;
}
格式化输出: 使用 %c 输出字符,%d 输出其ASCII码值。

🌊 浮点型(Floating-point)

浮点型用于存储实数(带小数点的数)。C语言提供两种主要的浮点类型:

  • float —— 单精度浮点型,通常占4字节,精度约6-7位有效数字。
  • double —— 双精度浮点型,通常占8字节,精度约15-16位有效数字,是默认的浮点类型。
  • long double —— 扩展精度浮点型,大小和精度依赖平台(通常10或16字节)。

浮点型示例代码

#include <stdio.h>

int main() {
    float pi = 3.14159f;           // f后缀表示float常量
    double e = 2.718281828459045;
    long double lg = 1.234567890123456789L;

    printf("float: %f\n", pi);
    printf("double: %.15f\n", e);  // 控制输出精度
    printf("long double: %Lf\n", lg);

    printf("Size of float: %zu bytes\n", sizeof(float));
    printf("Size of double: %zu bytes\n", sizeof(double));
    printf("Size of long double: %zu bytes\n", sizeof(long double));

    return 0;
}
注意: 浮点数在计算机中采用近似表示,比较两个浮点数是否相等时应使用差值小于某个精度,而不是直接使用 ==

🧩 void类型

void 表示“无类型”,主要用于以下场景:

  • 函数无返回值:void func(void);
  • 函数无参数:int func(void); (虽然可以省略,但建议显式写明)
  • 通用指针:void * 可以指向任何类型的数据,用于实现泛型编程。
说明: void 不能直接定义变量(如 void a; 是错误的),因为它代表未知类型,编译器无法分配内存。

🔄 类型转换

在C语言中,不同类型的数据可以进行混合运算,此时会发生类型转换。 转换分为隐式转换(自动)和显式转换(强制)。

隐式转换规则(部分)

  • 在算术运算中,较低精度类型会自动提升为较高精度类型(如 intfloat 运算,int 转为 float)。
  • 赋值时,右边表达式的类型会转换为左边变量的类型,可能发生截断或精度损失。
  • 整型提升:charshort 在表达式中通常会被提升为 int

强制类型转换示例

#include <stdio.h>

int main() {
    int a = 10;
    int b = 3;
    float result = (float)a / b;   // 将a强制转换为float,避免整数除法

    printf("10 / 3 = %f\n", result);

    char ch = 'A';
    int ascii = (int)ch;            // 将字符转为ASCII码
    printf("ASCII of %c = %d\n", ch, ascii);

    return 0;
}

💡 数据类型选择建议

  • 如果数值范围在 int 范围内,优先使用 int,它通常是最快的类型。
  • 需要节省内存时(如大数组),使用 shortchar
  • 需要存储大整数(超过21亿)时,使用 long longunsigned long long
  • 浮点数优先使用 double,除非内存非常紧张且精度要求不高。
  • 字符用 char,注意是否需要无符号(例如存储二进制数据)。

现在你已经掌握了C语言的基本数据类型。下一章我们将学习如何声明变量和常量,以及变量的作用域和生命周期。 请动手运行本节中的示例代码,观察不同数据类型的大小和输出结果。