2.4 C 语言类型转换、整数除法的应用

目录

1 隐式类型转换

2 显式类型转换

3 整数除法

4 小节判断题


1 隐式类型转换

        隐式类型转换(又称自动类型转换)发生在不同数据类型的值进行运算时,编译器会自动将较低类型的数据转换为较高类型的数据,以保证运算的顺利进行。

        转换的规则主要基于数据类型的 “大小” 和 “符号性”。一般来说,转换的优先级如下(从低到高):

  1. char 和 short 会被提升为 int(如果 int 能够表示它们的所有值)。
  2. 如果 int 不能表示 char 或 short 的所有值,则它们可能会被提升为 unsigned int
  3. 如果操作数中有 float 类型,则 int 和 unsigned int 会被转换为 float
  4. 如果操作数中有 double 类型,则 float 和 int 类型的操作数会被转换为 double
  5. 如果操作数中有 long double 类型,则其他类型的操作数会被转换为 long double

        前面章节曾提及:在定义一个浮点类型的变量时,倘若未通过 f 或 F 后缀来表明一个字面量属于 float 类型,且将其赋值给一个 float 类型的变量,那么编译器将会进行一次隐式类型转换(从 double 到 float),此种情况可能会造成精度的损失。

        下面是一个隐式类型转换的例子:

#include <stdio.h>

int main() {
    int intValue = 5;
    // float floatValue = 3.14;  不加 f 后缀,会发生 double -> float 隐式类型转换
    float floatValue = 3.14f;

    // 在这里,intValue 会被隐式地转换为 float 类型,以与 floatValue 进行加法运算
    float result = intValue + floatValue;

    printf("Result of addition: %f\n", result);// 8.140000

    return 0;
}

        这个例子中,intValue 是一个 int 类型的变量,而 floatValue 是一个 float 类型的变量。当它们被加在一起时,由于 float 类型比 int 类型具有更高的精度和范围,因此 intValue 会被隐式地转换为 float 类型,以便与 floatValue 进行加法运算。这种转换是自动的,不需要程序员显式地进行强制类型转换。 


2 显式类型转换

        显式类型转换(又称强制类型转换允许显式地将一个数据类型的值转换为另一个类型。这种转换是通过类型转换运算符来完成的,该运算符是一对圆括号,其中包含了目标类型的名称。例如,如果有一个 float 类型的变量,但想将它作为一个 int 类型来处理,可以这样做:

#include <stdio.h>

int main() {
    float f = 3.14f;

    int i = (int)f;    // 强制类型转换

    printf("%f\n",f);  // 3.140000
    printf("%d\n",i);  // 3

    return 0;
}

        注意:强制类型转换可能会导致数据丢失。


3 整数除法

        在整数除法的场景中,如果两个操作数都是整数,那么结果也会是整数。这意味着,小数部分会被自动截断。如果想看到小数部分,只需要将操作数之一转换为浮点数即可,如下所示:

#include <stdio.h>

int main() {

    int i = 5;
    float j = i / 2;  //由于 i 和 2 都是整数,所以这里的除法运算是整数除法。

    /* 如果想看到小数部分,只需要将操作数之一转换为浮点数即可 */
    // 方法 1:将整数变量 i 强制转换为浮点数 (float) i
    float k = (float) i / 2; // 强制转换,将整数 i 转换为浮点数

    // 方法 2:将除数 2 明确指定为浮点数 2.0 改变除法运算的性质
    // i 被隐式地转换为浮点数(通常是 double,因为 2.0 是 double 类型的)
    // 除法运算的结果是 double 类型的,因此在将结果赋值给 m 时,会发生从 double 到 float 的隐式类型转换
    float m = i / 2.0;  // 2.0 是一个浮点数字面量

    printf("%f\n", j);  // 2.000000,整数除法,小数部分会被自动截断
    printf("%f\n", k);  // 2.500000
    printf("%f\n", m);  // 2.500000
    
    return 0;
}

4 小节判断题

1、int i = 5; float f = i / 2; 那么 f 的值为 2.5 ?

A. 正确         B. 错误

答案: B

解释: 因为 i 是整型,所以除 2 是整除,得到的值是 2,如果要得到 2.5,应是 (float)i / 2。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Thanks_ks

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值