数据类型详解
嗨,我是长安!
数据类型是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; // 超长整型
不同整数类型的范围
| 类型 | 字节数 | 范围 |
|---|---|---|
char | 1 | -128 ~ 127 |
short | 2 | -32,768 ~ 32,767 |
int | 4 | -2,147,483,648 ~ 2,147,483,647 |
long | 4/8 | 看平台 |
long long | 8 | -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字节)
| 类型 | 字节数 | 精度 | 范围 |
|---|---|---|---|
float | 4 | 约7位有效数字 | ±3.4×10^38 |
double | 8 | 约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:查看类型大小
下一步
掌握了数据类型,接下来学习运算符!
👉 运算符详解