文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

揭秘C语言类型转换时发生了什么?

2024-12-02 15:53

关注

不同数据类型的存储大小和值范围是不一样的,程序在初始化的时候就已经设定了,例如:

  1. int a = 9; 
  2. float b = 8.5; 

a,b占的字节大小不一样,这个我们应该都知道,在C语言中一个表达式允许不同类型的数据进行运算,例如:

  1. int a = 9; 
  2. float b = 8.5,c; 
  3. c = a + b; 

因为计算机硬件在进行算术操作时,要求各操作数的类型具有相同的存储位数以及一样的存储方式,所以就出现了类型转换。

对于某些类型的转换,编译器可以隐式地自动进行,这种转换称为自动类型转换;

而有些类型转换需要程序员显式指明,那么通常把这种转换称为强制类型转换。

自动类型转换

自动转换是在源类型和目标类型兼容以及目标类型广于源类型时发生一个类型到另一类的转换。我们先来看一段代码:

  1. //vs2019 
  2. //来源:技术让梦想更伟大 
  3. //作者:李肖遥 
  4. #include  
  5. int main() 
  6.  //定义一个整型指针变量pPoint 
  7.  int* pPoint; 
  8.  
  9.  //定义基本的数据的类型 
  10.  char c; 
  11.  short s; 
  12.  int i; 
  13.  long l; 
  14.  float f; 
  15.  double d; 
  16.  
  17.  //将整型浮点型数据赋值给指针类型 
  18.  pPoint = c; 
  19.  pPoint = s; 
  20.  pPoint = i; 
  21.  pPoint = l; 
  22.  pPoint = f; 
  23.  pPoint = d; 
  24.   
  25.  return 0; 

由于指针变量和整型、浮点这些数据型的类型是不能相互赋值的,编译报错输出:


那么我们把同类型数据类型进行运算后赋值呢?

  1. //vs2019 
  2. //来源:技术让梦想更伟大 
  3. //作者:李肖遥 
  4. #include  
  5. int main() 
  6.  //定义一个整型指针变量pPoint 
  7.  int* pPoint; 
  8.  
  9.  //定义基本的数据的类型 
  10.  char c; 
  11.  short s; 
  12.  int i; 
  13.  long l; 
  14.  float f; 
  15.  double d; 
  16.  
  17.  //将整型浮点型数据运算之后赋值给指针类型 
  18.  pPoint = c + c; 
  19.  pPoint = s + s; 
  20.  pPoint = i + i; 
  21.  pPoint = l + l; 
  22.  pPoint = f + f; 
  23.  pPoint = d + d; 
  24.   
  25.  return 0; 

如下图所示:


同类型运算中:

那么我们把不同类型数据类型进行运算后赋值呢?

  1. //vs2019 
  2. //来源:技术让梦想更伟大 
  3. //作者:李肖遥 
  4. #include  
  5. int main() 
  6.  //定义一个整型指针变量pPoint 
  7.  int* pPoint; 
  8.  
  9.  //定义基本的数据的类型 
  10.  char c; 
  11.  short s; 
  12.  int i; 
  13.  long l; 
  14.  float f; 
  15.  double d; 
  16.  
  17.  //将整型浮点型数据混合运算赋值给指针类型 
  18.  pPoint = c + s;  // char + short = int 
  19.  pPoint = c + i;  // char + int = int 
  20.  pPoint = c + l;  // char + long = int 
  21.  pPoint = c + f;  // char + float = long 
  22.  pPoint = c + d;  // char + double = float 
  23.   
  24.  return 0; 

结果如下图所示:


可以得出在不同类型运算中:

我们得到结论如图:


int -> unsigned int -> long -> unsigned long -> long long -> unsigned long long

float -> double

自动转换规则:

强制类型转换

强制类型转换是通过类型转换运算来实现的。其一般形式为:

(类型说明符) (表达式)

其作用就是把表达式的运算结果强制转换成类型说明符所表示的类型的值。

  1. //vs2019 
  2. //来源:技术让梦想更伟大 
  3. //作者:李肖遥 
  4. #include 
  5. #include 
  6.  
  7. int main() 
  8.     float f,x=1.3,y=1.4; 
  9.     int i = 4,a,b; 
  10.     a = x + y; 
  11.     b = (int)(x+y); 
  12.     f = 10/i; 
  13.     printf("a=%d,b=%d,f=%f,x=%f,y=%f\n",a,b,f,x,y); 

运行结果如下:



我们从中可以看到,虽然x,y变强制转换int型,但是最后输出的值不变,强制类型转换没有影响x和y变量原本的类型。而上图警告已经说明了一切。

注意:在C语言中,对一个变量赋值的时候,这个变量初始定义的类型包含了两层含义:

  1. 这个数据类型表示的内存空间的大小。
  2. 编译器把设定的数值放到这个内存空间,是数据类型的存储方式解析后存进去的。

总结强调一点

进行强制类型转换后,内存空间里面的内容是不会发生改变的,改变的是运算时的临时数据对象的类型,是你去读取这个内存空间时的解析方法。所以,一定要对这个数据类型的内存空间和解析方式有一个清晰的认知。

 

来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯