首页 > 其他分享 >C语言 08 类型转换

C语言 08 类型转换

时间:2024-04-09 09:37:30浏览次数:19  
标签:类型转换 转换 int double 08 C语言 类型 include

一种类型的数据转换为另一种类型的数据,这种操作称为类型转换

类型转换分为自动类型转换强制类型转换

自动类型转换

比如现在希望将一个 short 类型的数据转换为 int 类型的数据:

#include <stdio.h>

int main(){
    short s = 10;
    // 直接将s的值传递给i即可,但是注意此时s和i的类型不同
    int i = s;
}

这里其实就是一种自动类型转换,就是编译器隐式地进行的数据类型转换,这种转换不需要编写者做什么,直接写就行,会自动进行转换操作。

如果使用一个比转换的类型最大值都还要大的值进行类型转换,比如:

#include <stdio.h>

int main() {
    int a = 511;
    // 最大127
    char b = a;
    printf("%d", b);
}
-1

很明显 char 类型是无法容纳大于 127 的数据的,因为只占一个字节。
而 int 占 4 个字节,如果需要进行转换,那么就只能丢掉前面的就只保留 char 所需要的那几位了,所以这里得到的就是 -1:

int = 511 -> 00000000 00000000 00000001 11111111
char -> 11111111 -> -1

也可以将整数和小数类型的数据进行互相转换:

#include <stdio.h>

int main() {
    int a = 99;
    double d = a;
    printf("%f", d);
}
99.000000

这里需要注意的是:小数类型在转换回整数类型时,会丢失小数部分(不是四舍五入,是直接丢失小数):

#include <stdio.h>

int main() {
    double a = 3.14;
    int b = a;
    printf("%d", b);
}
3

除了赋值操作可以进行自动类型转换之外,在运算中也会进行自动类型转换,比如:

#include <stdio.h>

int main() {
    float a = 2;
    int b = 3;
    double c = b / a;
    printf("%f", c);
}

1.500000

如果参与运算的既有整数类型,又有浮点类型,结果为什么是浮点类型呢?这是由于类型转换导致的。规则如下:

  • 不同的类型优先级不同(根据长度而定)

  • char和short类型在参与运算时一律转换为int再进行运算。

  • 浮点类型默认按双精度进行计算,所以就算有 float 类型,也会转换为 double 类型参与计算。

  • 当有一个更高优先级的类型和一个低优先级的类型同时参与运算时,统一转换为高优先级运算。

    int 和 long 参与运算,那么 int 转换为 long 再算,所以结果也是 long 类型;
    int 和double 参与运算,那么先把 int 转换为 double 再算,所以结果也是 double 类型。

强制类型转换

强制类型转换可以手动去指定类型,格式如下:

(强制转换类型) 变量、常量或表达式;

比如:

#include <stdio.h>

int main() {
    // 2.5是一个double类型的值,但是可以强制转换为int类型赋值给a,强制转换之后小数部分丢失
    int a = (int) 2.5;
    printf("%d", a);
}
2

也可以对一个算式的结果进行类型转换:

#include <stdio.h>

int main() {
    double a = 3.14;
    // 注意得括起来表示对整个算式的结果进行类型转换,不然强制类型转换只对其之后紧跟着的变量生效
    int b = (int) (a + 2.8);
    printf("%d", b);
}

5

在需要得到两个 int 相除之后带小数的结果时,强制类型转换就显得很有用:

#include <stdio.h>

int main() {
    int a = 10, b = 4;
    // 不进行任何的类型转换,int除以int结果仍然是int,导致小数丢失
    double c = a / b;
    // 对a进行强制类型转换,现在是double和int计算,根据上面自动类型转换规则,后面的int自动转换为double,结果也是double了,这样就是正确的结果了
    double d = (double) a / b;
    printf("不进行类型转换: %f, 进行类型转换: %f", c, d);
}

合理地使用强制类型转换,能够解决很多情况下的计算问题。

标签:类型转换,转换,int,double,08,C语言,类型,include
From: https://www.cnblogs.com/skysailstar/p/18123124

相关文章

  • REXROTH力士乐R900579494 VT5008-1X/
    REXROTH力士乐R900579494VT5008-1X/R901002095VT-VSPA2-1-2X/V0/T5是力士乐(Rexroth)公司生产的一款电液比例阀放大器,主要用于工业液压系统中对比例阀进行精确控制。以下是该产品的一些关键特性:电液比例控制:VT-VSPA2系列放大器能够将电信号转换成液压信号,实现对液压阀流量......
  • REXROTH力士乐R900608575 VT-DFP-B-2X/G24K0/0/V
    REXROTH力士乐R900608575VT-DFP-B-2X/G24K0/0/V力士乐(Rexroth)VT11166-1X是一个电子放大器,用于液压控制系统中。这个型号属于力士乐的VT系列放大器。同系列的型号可能会有类似的功能和安装尺寸,但可能在电气参数、控制信号、输出电流或功率等级等方面有所不同。为了找到VT11......
  • REXROTH力士乐R900608754 VT-DFPE-A-2X/G24K0/2A0F/V
    REXROTH力士乐R900608754VT-DFPE-A-2X/G24K0/2A0F/V力士乐(Rexroth)VT-HACD-1-1X/V0/1-P-0是一款液压阀,属于力士乐Hydac系列的过滤器和配件产品。这款产品通常用于过滤和调节液压系统中的流体,以保护系统免受污染和磨损,同时确保液压系统的稳定运行。以下是该产品的一些关键特性......
  • C语言 03 VSCode开发
    安装好C语言的开发环境后,就需要创建项目进行开发了。使用IDE(集成开发环境)进行开发了。C语言的开发工具很多,现在主流的有Clion、VisualStudio、VSCode。这里以VSCode作为演示。创建项目安装VSCode。推荐直接在微软的应用市场安装:安装插件。安装好VSCode......
  • 20240408,C++数组,函数,指针
    是谁说回老家学习结果摆烂了两天,是我,Π—Π! Π—Π!! 一,数组——同C1.1一维数组1.0  相同类型,连续内存,1.1  定义格式:数据类型数组名【长度】;数组类型数组名【长度】={1,2,3,……};数组类型数组名【】={1,2,3,……};1.2  遍历数组,初始化,下标【0-N】1.3  数组名:数......
  • 【C++对C语言的拓展】引用--3
    1.8指针引用#include <iostream>usingnamespace std; struct Teacher { char name[64]; int age ; }; //在被调⽤用函数获取资源int getTeacher(Teacher **p) {     Teacher *tmp = NULL; if (p == NULL)......
  • C语言练习题
    练习一:设某正方形的边长为整数,定义一个sideLen变量存储该边长值(自行设定任意整数边长),并定义一个squareArea变量存储该正方形面积(根据sideLen计算),输出该正方形的边长与面积。#include<stdio.h>intmain(){intsidelen=2,squareArea=sidelen*sidelen;printf(......
  • 【C语言】深入了解指针(2),进来小白,出去大佬!
    目录1,const修饰指针1.1,const修饰变量1.2,const修饰指针变量2,指针运算2.1,指针+-整数 2.2,指针-指针2.3,指针的关系运算3,野指针3.1,野指针成因1, 指针未初始化2.,指针越界访问3,指针指向的空间释放3.2,如何规避野指针1,指针初始化2,⼩⼼指针越界3,指针变量不再使⽤时,及时......
  • 《C语言深度解剖》:(4)深入理解一维数组和二维数组
    ......
  • Day5.一刷数据结构算法(C语言版) 242有效的字母异位词; 349两个数组的交集; 202快乐数; 1
        现在我们开始学习哈希表.        经过本次学习我认识到c++的便利,但是我使用的是c,那些功能c又用不了,导致代码长度一下子拉长了...        一刷的时候我还是先用c吧,等二刷的时候试试c++.        进入正题:        什么时候......