int (整数类型)
int 是 "integer" 的缩写,用于表示整数,整数是没有小数部分的数字,可以是正数、负数或零。
核心特点
- 用途: 存储整数,如年龄、数量、序号等。
- 精度: 精确,它表示的值是准确的,没有舍入误差。
- 内存大小:
int的大小取决于你的操作系统和编译器(通常是 32 位或 64 位)。- 在大多数现代的 32 位和 64 位系统上(如 Windows, Linux, macOS),
int占用 4 个字节(32 位)。 - 它可以表示的范围大约是 -2,147,483,648 到 2,147,483,647 (即 -2³¹ 到 2³¹ - 1)。
- 在大多数现代的 32 位和 64 位系统上(如 Windows, Linux, macOS),
- 内存表示: 在内存中,
int通常使用补码形式存储,这是处理有符号整数最常见的方式。
代码示例
#include <stdio.h>
int main() {
// 声明一个 int 类型的变量
int myAge = 30;
int score = -100;
int count = 0;
// 打印变量的值
printf("My age is: %d\n", myAge); // %d 是 int 的格式化输出符
printf("My score is: %d\n", score);
printf("Initial count is: %d\n", count);
// 进行数学运算
count = myAge + 10;
printf("Age in 10 years will be: %d\n", count);
return 0;
}
int 的常见变体
为了满足不同范围的需求,C 语言还提供了 int 的修饰符:
| 类型 | 大小 (典型) | 范围 (典型) | 描述 |
|---|---|---|---|
short int (或 short) |
2 字节 | -32,768 到 32,767 | 比 int 占用更少的内存,范围更小。 |
int |
4 字节 | -2,147,483,648 到 2,147,483,647 | 标准整数类型。 |
long int (或 long) |
4 或 8 字节 | 范围随系统变化 | 在 64 位系统上通常是 8 字节,范围更大。 |
long long int (或 long long) |
8 字节 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | 保证至少 64 位,用于非常大的整数。 |
double (双精度浮点数)
double 是 "double-precision floating-point number" 的缩写,用于表示带小数的数字(即实数)。"双精度"意味着它比 float(单精度)有更高的精度和更大的表示范围。
核心特点
- 用途: 存储需要小数的数值,如价格、科学测量、角度、重量等。
- 精度: 不精确,由于计算机使用二进制(基数为2)来表示小数,而十进制的小数(如0.1)在二进制中是无限循环的,
double只能存储一个近似值,这会导致微小的舍入误差。 - 内存大小:
double在几乎所有现代系统上都占用 8 个字节(64 位)。 - 内存表示:
double遵循 IEEE 754 标准,将 64 位分为三部分:- 符号位: 1 位,表示正负。
- 指数位: 11 位,决定数值的大小范围。
- 尾数位: 52 位,决定数值的精度。
代码示例
#include <stdio.h>
int main() {
// 声明一个 double 类型的变量
double price = 19.99;
double pi = 3.14159265359;
double temperature = -10.5;
// 打印变量的值
// %f 是 double/float 的默认格式化输出符
printf("The price is: $%.2f\n", price); // %.2f 表示保留两位小数
printf("The value of pi is: %f\n", pi);
printf("The temperature is: %f\n", temperature);
// 进行数学运算
double total = price * 2.5;
printf("The total for 2.5 items is: $%.2f\n", total);
// 展示精度问题
double tricky = 0.1 + 0.2;
printf("0.1 + 0.2 = %f\n", tricky); // 输出可能是 0.300000,而不是精确的 0.3
return 0;
}
double 的常见变体
| 类型 | 大小 (典型) | 精度 (有效数字) | 描述 |
|---|---|---|---|
float |
4 字节 (32 位) | 约 6-7 位十进制数字 | 单精度浮点数,占用内存少,但精度较低。 |
double |
8 字节 (64 位) | 约 15-16 位十进制数字 | 双精度浮点数,精度更高,是默认的浮点类型。 |
long double |
8, 12, 或 16 字节 | 通常比 double 更高 |
扩展精度浮点数,具体大小和精度取决于编译器和平台。 |
int vs. double 核心对比
| 特性 | int |
double |
|---|---|---|
| 数据类型 | 整数 | 浮点数 (实数) |
| 用途 | 计数、序号、索引等 | 科学计算、金融、需要小数的场景 |
| 精度 | 精确,无舍入误差 | 不精确,有舍入误差 |
| 内存占用 | 4 字节 ( | 8 字节 ( |
| 运算速度 | 通常更快 | 通常稍慢 (涉及更复杂的硬件指令) |
| 格式化输出 | %d |
%f 或 %lf (在 scanf 中) |
重要的注意事项和常见错误
精度问题 (最关键!)
double a = 0.1;
double b = 0.2;
if (a + b == 0.3) {
// 这里的代码很可能不会执行!
printf("This will not be printed.\n");
}
正确做法: 不要用 直接比较两个 double 是否相等,应该检查它们的差值是否在一个很小的误差范围内(1e-9)。
#include <math.h> // 需要包含 math.h
if (fabs(a + b - 0.3) < 1e-9) {
printf("They are effectively equal.\n");
}
混合运算时的类型转换
当 int 和 double 一起运算时,C 语言会自动将 int 提升 为 double,以避免精度丢失。
int i = 5; double d = 2.5; // i 会被临时转换为 5.0 double result = i / d; // result = 5.0 / 2.5 = 2.0
scanf 中的 %d 和 %lf
这是一个非常常见的初学者错误。
- 对于
int变量,使用%d。 - 对于
double变量,必须使用%lf(lf代表 long float)。
#include <stdio.h>
int main() {
int myInt;
double myDouble;
printf("Enter an integer: ");
scanf("%d", &myInt); // 正确
printf("Enter a double: ");
scanf("%lf", &myDouble); // 正确!不是 %f
printf("You entered: %d and %f\n", myInt, myDouble);
return 0;
}
注意: 在 printf 中,打印 double 可以用 %f 或 %lf,但在 scanf 中读取 double 必须用 %lf。
- 用
int当你确定只需要整数时,它速度快,精确,内存占用小。 - 用
double当你需要小数时,但要时刻记住它的精度是有限的,不要用 直接比较两个double。 - 理解类型转换:当不同类型运算时,系统会自动进行类型提升,通常是向精度更高的类型(
double)提升。
选择正确的数据类型是编写健壮、高效 C 程序的第一步。
