int、float、double数据类型有何本质区别?

99ANYc3cd6
预计阅读时长 14 分钟
位置: 首页 C语言 正文
  • int: 用于表示整数(没有小数点)。
  • float: 用于表示单精度浮点数(即带有小数点的近似值)。
  • double: 用于表示双精度浮点数(比 float 精度更高、范围更广的近似值)。

下面我们从多个维度进行详细的对比。

c语言intfloatdouble区别
(图片来源网络,侵删)

核心区别总结表

特性 int (整数) float (单精度浮点数) double (双精度浮点数)
数据类型 整型 浮点型 浮点型
表示范围 -2,147,483,648 到 2,147,483,647 (32位系统) 约 ±3.4 x 10±38 约 ±1.7 x 10±308
精度 精确(只要在范围内) 约 6-7 位有效数字 约 15-16 位有效数字
内存大小 通常为 4 字节 (32位) 通常为 4 字节 (32位) 通常为 8 字节 (64位)
格式化输出 %d%i %f %lf
后缀 无 (如 123) fF (如 14f) lL (如 14159L)
用途 计数、索引、年龄、数量等科学计算、金融、需要高精度的场景 图形学、物理模拟等需要大范围但精度要求不高的场景

详细解释

int (Integer - 整数)

int 是最基本、最常用的数据类型,用来存储没有小数部分的整数。

  • 精度int精确的,只要数字在它的表示范围内,它就能被完美存储,不会丢失任何信息。1001000000 存储为 int 都是精确的。
  • 范围:范围是有限的,在大多数现代系统(32位或64位)上,int 是32位的,可以表示从 -2,147,483,648 到 2,147,483,647 之间的整数,如果超出这个范围(称为“溢出”),结果就会是未定义的,通常是错误的。
  • 示例
    int age = 30;
    int numberOfStudents = 1024;
    int temperature = -10; // 冬天的温度

float (Single-Precision Floating-Point - 单精度浮点数)

float 用来存储带有小数的数字,但它是一种近似值,而不是精确值。

  • 精度float不精确的,它用 32 位内存来存储一个数字,其中一部分用于存储指数(决定小数点的位置),一部分用于存储尾数(决定有效数字),这导致它能表示的数字范围很大,但精度有限,通常只有 6 到 7 位有效数字
    • 什么是有效数字? 1415926 如果存为 float,可能只能精确存储前 7 位,变成 141593,再比如 0 存为 float,可能会变成 0,因为后面的数字超出了精度范围。
  • 范围:范围比 int 大得多,可以表示非常大或非常小的数字。
  • 示例
    float pi = 3.141592f; // 注意 f 后缀,告诉编译器这是一个 float
    float price = 19.99f;
    float scientific = 1.23e10f; // 1.23 * 10^10

double (Double-Precision Floating-Point - 双精度浮点数)

doublefloat 的增强版,它使用 64 位内存来存储浮点数,提供了更高的精度和更大的表示范围。

  • 精度double 也是不精确的,但精度比 float 高得多,通常有 15 到 16 位有效数字,对于绝大多数科学计算和工程应用来说,这个精度已经足够了,如果你需要存储 14159265358979323846,使用 double 可以存下更多位数。
  • 范围:范围比 float 更大,可以表示更大或更小的数字。
  • 示例
    double precisePi = 3.141592653589793; // 没有 f 后缀,默认是 double
    double distance = 150000000000.0; // 地球到太阳的平均距离(公里)
    double verySmall = 1.23e-20; // 1.23 * 10^-20

关键区别深入剖析

内存占用与性能

  • int: 4 字节
  • float: 4 字节
  • double: 8 字节

这意味着一个 double 变量占用的内存是一个 intfloat 的两倍。

c语言intfloatdouble区别
(图片来源网络,侵删)

在性能方面:

  • 整数运算 (int) 通常比浮点数运算快得多,因为 CPU 有专门针对整数运算的优化指令。
  • 浮点数运算 (float vs double):在现代 CPU 上,floatdouble 的运算速度可能相差不大,因为 64 位 CPU 通常能一次性处理 64 位(即 double)的数据,但在一些旧的或嵌入式系统上,float 运算可能会更快,因为它占用的带宽和缓存更少。总体原则:在精度满足要求的前提下,优先使用 float 以节省内存和潜在的带宽。

精度问题(非常重要!)

这是浮点数(floatdouble)最需要注意的地方。永远不要用 来直接比较两个浮点数是否相等!

由于它们是二进制的近似表示,很多十进制小数在二进制中是无限循环小数,无法被精确表示。1 在二进制中是一个无限循环小数。

#include <stdio.h>
int main() {
    float a = 0.1f;
    float b = 0.2f;
    float sum = a + b;
    // 你期望 sum == 0.3,但实际结果可能不是精确的
    if (sum == 0.3f) {
        printf("sum is equal to 0.3\n"); // 这行可能不会执行!
    } else {
        printf("sum is NOT equal to 0.3. It is: %f\n", sum); // 更可能发生的情况
    }
    // 正确的比较方法是判断它们的差值是否在一个很小的“误差范围”内
    float epsilon = 0.00001f;
    if ((sum - 0.3f) < epsilon && (0.3f - sum) < epsilon) {
        printf("sum is approximately equal to 0.3\n");
    }
    return 0;
}

格式化输出 (printf)

这是初学者常犯的错误。

c语言intfloatdouble区别
(图片来源网络,侵删)
  • 打印 int:使用 %d%i
  • 打印 floatdouble:都使用 %f
  • 特别注意:在 scanf 函数中,读取 double 类型时必须使用 %lf,否则会导致行为未定义(通常是读取错误),但在 printf 中,打印 double 可以用 %f%lf%f 更常见。
#include <stdio.h>
int main() {
    int i = 10;
    float f = 3.14f;
    double d = 3.1415926535;
    printf("int: %d\n", i);      // 正确
    // printf("int: %f\n", i);   // 错误!格式不匹配
    printf("float: %f\n", f);    // 正确
    printf("double: %f\n", d);   // 正确,打印 double 用 %f 是标准做法
    double value;
    printf("Enter a double: ");
    scanf("%lf", &value);        // 正确!读取 double 必须用 %lf
    // scanf("%f", &value);      // 错误!
    return
-- 展开阅读全文 --
头像
dede5.7仿图片素材下载模板网源码哪里有?
« 上一篇 11-27
dede备份的数据库txt如何用sql打开?
下一篇 » 11-27
取消
微信二维码
支付宝二维码

目录[+]