在编程中,数据类型决定了变量可以存储什么样的数据以及占用多少内存空间。 C语言提供了丰富的基本数据类型,包括整型、浮点型和字符型等。理解这些数据类型是编写高效、正确程序的基础。 本节将详细介绍C语言的基本数据类型及其特性。
C语言中的数据类型分为四大类:基本数据类型、构造数据类型(如数组、结构体、共用体)、 指针类型和空类型(void)。本章重点讲解基本数据类型,它们是构成更复杂数据的基础。
整型用于存储整数(不包含小数部分)。C语言提供多种整型,以适应不同范围的数值需求。 主要整型包括:
int —— 基本整型,通常占4个字节(32位),范围约 -2.1e9 ~ 2.1e9。short 或 short int —— 短整型,通常占2个字节,范围 -32768 ~ 32767。long 或 long int —— 长整型,在32位系统通常占4字节,64位系统占8字节。long long —— 长长整型,至少占8字节(C99标准引入)。整型还可以配合 signed(有符号)和 unsigned(无符号)修饰符使用:
| 类型 | 大小(字节) | 有符号范围 | 无符号范围 | 格式说明符 |
|---|---|---|---|---|
short | 2 | -32,768 ~ 32,767 | 0 ~ 65,535 | %hd / %hu |
int | 4 | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 | %d / %u |
long | 4 或 8* | 至少 -2,147,483,648 ~ 2,147,483,647 | 至少 0 ~ 4,294,967,295 | %ld / %lu |
long long | 8 | -9.2e18 ~ 9.2e18 | 0 ~ 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 类型用于存储单个字符,如字母、数字、标点符号等。
实际上,字符在内存中是以其ASCII码(整数)存储的,因此 char 本质上也是一种整型。
它通常占1个字节(8位),可以存储 -128 到 127(有符号)或 0 到 255(无符号)的整数。
#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码值。
浮点型用于存储实数(带小数点的数)。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 func(void);int func(void); (虽然可以省略,但建议显式写明)void * 可以指向任何类型的数据,用于实现泛型编程。void 不能直接定义变量(如 void a; 是错误的),因为它代表未知类型,编译器无法分配内存。
在C语言中,不同类型的数据可以进行混合运算,此时会发生类型转换。 转换分为隐式转换(自动)和显式转换(强制)。
int 和 float 运算,int 转为 float)。char 和 short 在表达式中通常会被提升为 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,它通常是最快的类型。short 或 char。long long 或 unsigned long long。double,除非内存非常紧张且精度要求不高。char,注意是否需要无符号(例如存储二进制数据)。现在你已经掌握了C语言的基本数据类型。下一章我们将学习如何声明变量和常量,以及变量的作用域和生命周期。 请动手运行本节中的示例代码,观察不同数据类型的大小和输出结果。