C语言中int与double有何区别?

99ANYc3cd6
预计阅读时长 15 分钟
位置: 首页 C语言 正文

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)。
  • 内存表示: 在内存中,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");
}

混合运算时的类型转换

intdouble 一起运算时,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 程序的第一步。

-- 展开阅读全文 --
头像
c语言graphics.h
« 上一篇 03-21
C程序设计语言第2版新版有何不同?
下一篇 » 03-21

相关文章

取消
微信二维码
支付宝二维码

目录[+]