int (整数类型)
int 是 C 语言中最基本、最常用的整数类型。

(图片来源网络,侵删)
特点
- 用途: 用于存储没有小数部分的数字,
10,-25,0,999。 - 大小:
int所占的字节数(内存空间)取决于编译器和操作系统,在绝大多数现代系统(如 64 位 Windows, Linux, macOS)上,int占用 4 个字节(32 位)。 - 表示范围: 因为是 32 位,它可以表示大约 -2,147,483,648 到 2,147,483,647 之间的整数(即 -2³¹ 到 2³¹-1)。
- 精度: 精确,只要数值在
int的表示范围内,它就能被精确存储,不会有任何精度丢失。
示例代码
#include <stdio.h>
int main() {
int age = 30;
int negative_number = -100;
int zero = 0;
printf("Age: %d\n", age); // 输出: Age: 30
printf("Negative Number: %d\n", negative_number); // 输出: Negative Number: -100
printf("Zero: %d\n", zero); // 输出: Zero: 0
return 0;
}
%d 是 printf 函数中用来打印 int 类型变量的格式说明符。
double (双精度浮点数类型)
double 是 C 语言中用于存储带小数部分的数字(即浮点数)的类型。
特点
- 用途: 用于存储实数,
14,-99.98,5,123456。 - 大小:
double通常占用 8 个字节(64 位),这是 C 标准规定的,因此在所有平台上都具有一致的大小。 - 表示范围: 范围非常大,大约是 ±1.7 × 10³⁰⁸。
- 精度: 不精确。
double使用二进制浮点数来表示十进制小数,这会导致很多十进制小数在计算机内部无法被精确表示,从而产生微小的误差(称为“舍入误差”)。
示例代码
#include <stdio.h>
int main() {
double pi = 3.14159265358979;
double price = 99.98;
double scientific = 1.23e4; // 科学计数法,表示 1.23 * 10^4 = 12300.0
printf("Pi: %.15f\n", pi); // 输出: Pi: 3.141592653589793 (注意末尾可能有微小变化)
printf("Price: %.2f\n", price); // 输出: Price: 99.98 (保留两位小数)
printf("Scientific: %f\n", scientific); // 输出: Scientific: 12300.000000
return 0;
}
%f是printf函数中用来打印double类型变量的格式说明符。%.15f表示打印 15 位小数,可以更清楚地看到double的精度限制。23e4是科学计数法,e代表“指数”。
int 和 double 之间的转换 (核心重点)
在 C 语言中,int 和 double 是两种完全不同的数据类型,当你需要将一种类型的值赋给另一种类型的变量时,就会发生类型转换。
a) int 转换为 double (隐式转换)
当你将一个 int 值赋给一个 double 变量时,C 编译器会自动进行转换,这个过程称为隐式转换或类型提升。

(图片来源网络,侵删)
- 规则:
int会先被转换为一个等值的double,因为double的范围远大于int,并且可以精确表示所有整数,所以这个转换是精确且安全的。
示例代码
#include <stdio.h>
int main() {
int my_int = 100;
double my_double;
// 将 int 赋值给 double
my_double = my_int;
printf("my_int is: %d\n", my_int); // 输出: my_int is: 100
printf("my_double is: %f\n", my_double); // 输出: my_double is: 100.000000
// 也可以直接在表达式中混合使用
double result = 10 + 5.5; // 10 (int) 会被临时提升为 10.0 (double),然后与 5.5 相加
printf("Result is: %f\n", result); // 输出: Result is: 15.500000
return 0;
}
b) double 转换为 int (需要显式转换)
当你将一个 double 值赋给一个 int 变量时,编译器会发出警告,因为这种转换会丢失信息(小数部分),你必须告诉编译器你确实想要这样做,这个过程称为显式转换或强制类型转换。
- 规则:
double的小数部分会被直接丢弃(截断),而不是四舍五入。99会被转换为3,-2.7会被转换为-2。
示例代码
#include <stdio.h>
int main() {
double my_double = 123.987;
int my_int;
// 错误示例: 编译器会警告
// my_int = my_double; // warning: implicit conversion loses integer precision
// 正确示例: 使用强制类型转换 (cast)
my_int = (int)my_double; // (int) 是强制类型转换操作符
printf("my_double is: %f\n", my_double); // 输出: my_double is: 123.987000
printf("my_int is: %d\n", my_int); // 输出: my_int is: 123 (小数部分 .987 被丢弃了)
double negative_double = -5.6;
int negative_int = (int)negative_double;
printf("negative_int is: %d\n", negative_int); // 输出: negative_int is: -5 (向零截断)
return 0;
}
何时使用 int,何时使用 double?
这是一个非常重要的编程实践问题。
| 特性 | int |
double |
|---|---|---|
| 用途 | 计数、索引、年龄、数量等整数。 | 科学计算、财务、物理测量、任何需要小数的值。 |
| 精度 | 精确。 | 不精确(有舍入误差)。 |
| 性能 | 通常比 double 更快,因为整数运算在 CPU 上更简单。 |
通常比 int 慢,因为浮点数运算更复杂。 |
| 存储 | 在现代系统上通常是 4 字节。 | 通常是 8 字节。 |
具体场景分析
-
使用
int:int student_count = 30;// 学生人数必须是整数。for (int i = 0; i < 100; i++) { ... }// 循环计数器必须是整数。int array_index = 5;// 数组索引必须是整数。
-
使用
double:
(图片来源网络,侵删)double pi = 3.14159;// 圆周率是无理数。double temperature = 36.6;// 体温有小数。double account_balance = 12345.67;// 财务金额(注意:金融领域通常建议使用专门的库如decimal来避免精度问题,但double是 C 语言中最接近的选择)。double distance = 123.456;// 距离测量。
| 特性 | int |
double |
|---|---|---|
| 数据类型 | 整型 | 双精度浮点型 |
| 大小 | 通常是 4 字节 | 通常是 8 字节 |
| 用途 | 存储整数 | 存储实数(带小数) |
| 精度 | 精确 | 不精确(有舍入误差) |
int -> double |
自动、安全、精确 | |
double -> int |
需要强制转换 (int),会截断小数部分 |
理解 int 和 double 的区别以及它们之间的转换规则是学习 C 语言的基础,也是编写健壮、无错误代码的关键。
