前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C语言】强制类型转换的原理

【C语言】强制类型转换的原理

作者头像
举杯邀明月
发布2023-04-12 17:21:32
1.2K0
发布2023-04-12 17:21:32
举报
文章被收录于专栏:C++&linuxC++&linux


一、对指针进行强制类型转换

1.1printf打印时的转换形式

代码语言:javascript
复制
int main()
{
	int a = 5;
	printf("%lf", a);
	return 0;
}

解释代码: 这样的代码虽然能编译的过去,但其实是有不妥当的地方的,但平常我们在做题的时候难免遇到这样的代码风格,所以我们在这里解释一下这样的代码,但希望大家还是不要写出这样的代码来,这样的代码风格其实是不好的

其实我们先创建了一个大小为5的一个整型变量,并且这个变量以二进制的形式存储到栈区里面,占据了32个比特位,然后我们就进行打印了,但我们却以双精度浮点数的形式打印这个整型数字5,此时5的二进制代码已经存储到内存里面了,是没有进行改变的,所以存储形式是不会变得,而我们现在却改变了读取方式,我们用双精度的形式来读取这个二进制代码,分别读取他的符号位,指数位,有效位,所以我们打印出来的数,其实就是用读取浮点型的方法来读出整型5的二进制代码,然后进行结果的打印(如果这里不清楚浮点型的读取方法的话,可以去看我之前的博客,整形的存储)

1.2用指针操作符的转换形式

代码语言:javascript
复制
int a = 1234567890;
float *f = (float *)&a;
printf("%f", *f);

代码解释: 这样的代码风格是值得表扬的,我们都应该写出这样高质量的代码。

先把整型数字a的二进制代码放到内存里面,然后我们现在拿出这个整型变量a的地址,并将其进行修改为单精度浮点数的地址形式,然后我们把这个修改后的地址放到浮点型指针变量f里面去,最后我们对变量f进行解引用操作,其实就是将a的二进制代码按照浮点型的形式拿出来,然后进行打印,如果你想要知道这个打印的结果的话,你必须写出来他的二进制代码,然后将其按照浮点型中表示方法的对应比特位的个数拿出来,最后进行结果读取

1.3总结

这两种代码其实表达的内涵意思是相同的,他们是没有改变内存中变量的存储形式的,改变的是其读取方式,而且第二段的代码风格大家要学习,尽量写出这样的代码来。

这时有人可能会问到了,那既然两段代码表达的意思相同而且第二段代码的风格还比较好,那博主你还介绍第一段代码干什么呀,直接给我们讲哪个最好的代码不就得了吗???而且还列举个代码风格不好的代码,你这是何必呢?

其实答案很简单嘛,你做题总会遇到形形色色的代码,我不得给你介绍全面?要不然你肯定会想,那个笨笨的博主没有讲清楚这个知识点呀!不能你做不出来题,或者因为代码风格不好,你就不做这题了吧🤣🤣🤣

二、对变量进行强制类型转换

2.1 我们可能见到的形式

代码语言:javascript
复制
int main() {
    float a;
    scanf("%f", &a);
    if (a > 0)
    {
        int b = a + 0.5;
        printf("%d", b);     //这其实是牛客网上的一道题,我当时就没看懂这段代码
    }
    else
    {
        int b = a - 0.5;
        printf("%d", b);
    }
    return 0;
}
在这里插入图片描述
在这里插入图片描述

代码解释: 其实这里的代码如果你看不懂的话,不怨人家的代码,还得怨你自己的能力不够,能看懂的人自然能看懂,你能力不够怨不得谁,这话也是说给我自己的哈

比较隐藏的地方就是,把那个浮点数+0.5赋值给了整型变量b里面了,这其实就是进行 了一个比较隐含的对变量进行的强制类型转换

比如你输入14.99,+0.5后变为15.49,这时我们又将其存到整型变量b里面,也就发生了强制类型转换,我们会改变a原来在内存里面表达为14.99的浮点型二进制代码形式,将其改变为表达15的整型二进制代码形式

2.2 标准形式

代码语言:javascript
复制
int main()
{
	int a = 1234567890;
	float f = (float)a;
	printf("%lf", f);
}
代码语言:javascript
复制
int main()
{
	int a = 1234567890;
	double f = (double)a;
	printf("%lf", f);
}

代码解释: 编译器会先把a按照整型的形式(1234567890)将它的二进制代码存到栈区里面,然后我们要将其存到浮点型变量f里面,所以这时就又按照浮点型的格式存到内存里面了(表达的为1234567890.000000),但此时它在内存中的存储方式已经改变了,他变成能表达为1234567890.000000这样的浮点型数字的二进制代码了,而不是原来表达为1234567890 这样的整型数字的二进制代码了,所以我们打印结果就变成了1234567890.000000

这里给大家放了两端代码,其实还想另外对比一下单精度浮点型和双精度浮点型的区别,我们把1234567890这么大的整型数字存到内存后,将其强制类型转换为浮点型然后打印,其实就变成了原有的数字后面带上小数位,但因为精度的不同,所以我们两种浮点型能够表达的最大精度数字也是不同的,如果你这里编译一下第一段代码,就会发现它和第二段代码的结果不一样,这其实就是他的精度不够无法打印出你所期望的数字。我们只要将类型改成double就行了

2.3总结

变量的强制类型转换和指针的强制类型转换,本质就在于一个改变了其内存二进制的存储形式,一个未改变其内存二进制的存储形式

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、对指针进行强制类型转换
    • 1.1printf打印时的转换形式
      • 1.2用指针操作符的转换形式
        • 1.3总结
        • 二、对变量进行强制类型转换
          • 2.1 我们可能见到的形式
            • 2.2 标准形式
              • 2.3总结
              相关产品与服务
              对象存储
              对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档