C语言快速入门教程
首页
入门指南
基础教程
进阶教程
实战案例
编程指南
首页
入门指南
基础教程
进阶教程
实战案例
编程指南
  • 基础教程

    • Hello World 深入理解
    • 变量详解
    • 数据类型详解
    • 运算符详解
    • 输入输出详解
    • 条件判断 if-else
    • 循环语句
    • 函数详解
    • 数组详解

数据类型详解

嗨,我是长安!

数据类型是C语言的基础知识。我刚开始学的时候,对int、float、char这些类型也是一头雾水。现在让我用最通俗的方式给你讲清楚。

什么是数据类型?

数据类型就是告诉计算机:这个变量要存储什么样的数据。

我喜欢用生活中的容器来理解:

  • 🥤 杯子 → 装液体 → float(小数)
  • 📦 盒子 → 装物品 → int(整数)
  • 📝 信封 → 装信件 → char(字符)

C语言的数据类型

graph TB
    A[C语言数据类型] --> B[基本类型]
    A --> C[构造类型]
    A --> D[指针类型]
    A --> E[空类型void]
    B --> F[整型 int]
    B --> G[浮点型 float/double]
    B --> H[字符型 char]
    C --> I[数组]
    C --> J[结构体 struct]
    C --> K[联合 union]

整数类型(Integer)

基本整数类型

int age = 18;          // 整数
short s = 100;         // 短整型
long l = 1000000;      // 长整型
long long ll = 1000000000000;  // 超长整型

不同整数类型的范围

类型字节数范围
char1-128 ~ 127
short2-32,768 ~ 32,767
int4-2,147,483,648 ~ 2,147,483,647
long4/8看平台
long long8-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

无符号整数(unsigned)

unsigned int age = 18;        // 0 ~ 4,294,967,295
unsigned short s = 100;       // 0 ~ 65,535
unsigned long l = 1000000;    // 0 ~ ...

示例:

#include <stdio.h>

int main() {
    int normalInt = -100;
    unsigned int positiveInt = 100;
    
    printf("有符号整数:%d\n", normalInt);
    printf("无符号整数:%u\n", positiveInt);
    
    // 查看类型大小
    printf("int 占用 %lu 字节\n", sizeof(int));
    printf("short 占用 %lu 字节\n", sizeof(short));
    printf("long 占用 %lu 字节\n", sizeof(long));
    
    return 0;
}

浮点类型(Floating Point)

float vs double

float price = 19.99;           // 单精度浮点数(4字节)
double pi = 3.141592653589793; // 双精度浮点数(8字节)
类型字节数精度范围
float4约7位有效数字±3.4×10^38
double8约15位有效数字±1.7×10^308

示例:

#include <stdio.h>

int main() {
    float f = 3.1415926;
    double d = 3.1415926535897932;
    
    printf("float:  %.10f\n", f);  // 只能精确到7位左右
    printf("double: %.15f\n", d);  // 可以精确到15位左右
    
    return 0;
}

输出:

float:  3.1415927410
double: 3.141592653589793

字符类型(Character)

字符的本质

字符其实是小整数(ASCII码)!

#include <stdio.h>

int main() {
    char ch = 'A';
    
    printf("字符:%c\n", ch);         // 输出:A
    printf("ASCII码:%d\n", ch);      // 输出:65
    
    char digit = '5';
    printf("字符:%c\n", digit);      // 输出:5
    printf("ASCII码:%d\n", digit);   // 输出:53
    
    return 0;
}

常用ASCII码

字符ASCII码说明
'0'-'9'48-57数字字符
'A'-'Z'65-90大写字母
'a'-'z'97-122小写字母
' '32空格
'\n'10换行

字符运算

#include <stdio.h>

int main() {
    char lower = 'a';
    char upper = lower - 32;  // 小写转大写
    
    printf("小写:%c\n", lower);  // a
    printf("大写:%c\n", upper);  // A
    
    // 字母后移
    char ch = 'A';
    ch = ch + 1;
    printf("A的下一个字母:%c\n", ch);  // B
    
    return 0;
}

布尔类型(C99引入)

C语言早期没有布尔类型,C99标准引入了 _Bool 和 <stdbool.h>:

#include <stdio.h>
#include <stdbool.h>

int main() {
    bool isStudent = true;
    bool isTeacher = false;
    
    printf("是学生吗?%d\n", isStudent);   // 1
    printf("是老师吗?%d\n", isTeacher);   // 0
    
    return 0;
}

长安说

在C语言中:

  • 0 表示假(false)
  • 非0 表示真(true)

我当年经常搞混这个,现在总算记住了😂

字符串(特殊的字符数组)

#include <stdio.h>

int main() {
    char name[] = "小明";
    char greeting[] = "Hello, World!";
    
    printf("姓名:%s\n", name);
    printf("问候:%s\n", greeting);
    
    return 0;
}

注意

字符串不是基本数据类型,而是字符数组!后面会详细讲解。

类型转换

自动类型转换(隐式转换)

#include <stdio.h>

int main() {
    int a = 10;
    float b = 3.14;
    float result = a + b;  // int自动转换为float
    
    printf("结果:%.2f\n", result);  // 13.14
    
    return 0;
}

转换规则:

graph LR
    A[char] --> B[int]
    B --> C[long]
    C --> D[float]
    D --> E[double]

强制类型转换(显式转换)

#include <stdio.h>

int main() {
    float pi = 3.14159;
    int intPi = (int)pi;  // 强制转换为int
    
    printf("float: %.5f\n", pi);      // 3.14159
    printf("int: %d\n", intPi);       // 3(小数部分被截断)
    
    // 除法
    int a = 7, b = 2;
    float result1 = a / b;           // 整数除法
    float result2 = (float)a / b;    // 浮点除法
    
    printf("7/2 = %f\n", result1);    // 3.000000
    printf("7/2 = %f\n", result2);    // 3.500000
    
    return 0;
}

sizeof 运算符

查看数据类型占用的字节数:

#include <stdio.h>

int main() {
    printf("=== 数据类型大小 ===\n");
    printf("char: %lu 字节\n", sizeof(char));
    printf("short: %lu 字节\n", sizeof(short));
    printf("int: %lu 字节\n", sizeof(int));
    printf("long: %lu 字节\n", sizeof(long));
    printf("long long: %lu 字节\n", sizeof(long long));
    printf("float: %lu 字节\n", sizeof(float));
    printf("double: %lu 字节\n", sizeof(double));
    
    // 查看变量大小
    int age = 18;
    printf("age变量: %lu 字节\n", sizeof(age));
    
    return 0;
}

实战案例

案例1:数据类型选择

根据实际需求选择合适的类型:

#include <stdio.h>

int main() {
    // 年龄:0-150,用 unsigned char 足够
    unsigned char age = 25;
    
    // 人口数:很大,用 long
    long population = 1400000000;
    
    // 价格:有小数,用 float
    float price = 99.99;
    
    // 科学计算:需要高精度,用 double
    double pi = 3.141592653589793;
    
    printf("年龄:%u\n", age);
    printf("人口:%ld\n", population);
    printf("价格:%.2f\n", price);
    printf("圆周率:%.15f\n", pi);
    
    return 0;
}

案例2:温度类型转换

#include <stdio.h>

int main() {
    int celsius = 25;
    float fahrenheit;
    
    // 整数转浮点数
    fahrenheit = (float)celsius * 9.0 / 5.0 + 32.0;
    
    printf("%d°C = %.2f°F\n", celsius, fahrenheit);
    
    return 0;
}

案例3:字符处理

#include <stdio.h>

int main() {
    char input = 'a';
    
    // 判断是否为小写字母
    if (input >= 'a' && input <= 'z') {
        char upper = input - 32;
        printf("'%c' 的大写是 '%c'\n", input, upper);
    }
    
    // 判断是否为数字字符
    char num = '5';
    if (num >= '0' && num <= '9') {
        int value = num - '0';  // 转换为实际数字
        printf("字符'%c'的数值是%d\n", num, value);
    }
    
    return 0;
}

练习题

练习1:计算BMI

// 已知:
// 身高 height = 1.75 米
// 体重 weight = 70 千克
// 计算BMI = weight / (height * height)
// 提示:使用 float 类型

练习2:时间表示

// 用变量表示当前时间:14:30:45
// 要求:
// - 小时用 char(0-23)
// - 分钟用 char(0-59)
// - 秒用 char(0-59)
// - 打印格式:HH:MM:SS

练习3:类型转换练习

// 计算 10 / 3 的结果
// 分别输出:
// 1. 整数结果
// 2. 浮点数结果(保留2位小数)

答案参考

查看答案

练习1:

#include <stdio.h>

int main() {
    float height = 1.75;
    float weight = 70.0;
    float bmi = weight / (height * height);
    
    printf("身高:%.2f米\n", height);
    printf("体重:%.2f千克\n", weight);
    printf("BMI:%.2f\n", bmi);
    
    return 0;
}

练习2:

#include <stdio.h>

int main() {
    unsigned char hour = 14;
    unsigned char minute = 30;
    unsigned char second = 45;
    
    printf("当前时间:%02d:%02d:%02d\n", hour, minute, second);
    
    return 0;
}

练习3:

#include <stdio.h>

int main() {
    int a = 10, b = 3;
    
    int intResult = a / b;
    float floatResult = (float)a / b;
    
    printf("整数结果:%d\n", intResult);
    printf("浮点结果:%.2f\n", floatResult);
    
    return 0;
}

知识点总结

  • ✅ 整型:char, short, int, long, long long
  • ✅ 浮点型:float(4字节), double(8字节)
  • ✅ 字符型:char(本质是小整数)
  • ✅ 布尔型:bool(需要C99及以上)
  • ✅ 类型转换:自动转换和强制转换
  • ✅ sizeof:查看类型大小

下一步

掌握了数据类型,接下来学习运算符!

👉 运算符详解

最近更新: 2025/12/26 14:29
Prev
变量详解
Next
运算符详解