细讲类型转换

本文探讨了隐形转换和强制转换在编程中的应用及其潜在风险。隐形转换由编译器自动完成,可能涉及内存访问安全和转换结果的安全性。强制转换可能导致内存截断或访问范围扩张,例如将浮点数转换为整数时可能出现溢出。通过实例展示了强制转换中内存访问的不安全性,如将double类型转换为int类型时的潜在问题。强调在进行类型转换时需注意数据安全和正确性。
摘要由CSDN通过智能技术生成

1.隐形转换

所谓隐形转换,就是编译器在背后帮程序员做的类型转换工作,程序员往往察觉不到。既然是编译器自动进行,那么这种类型转换都具有足够的安全性,这都是编译器的责任。

这里我们提及到的安全性主要由两个方面:内存单元访问的安全性转换结果的安全性。主要表现为内存访问范围的扩张、内存的截断、尾数的截断、值的改变和溢出等。

注:

一个低级数据类型对象总是优先转换成能容纳得它的最大值在、占用内存最小单元的类型。

2.强制转换

我们首先来看如下代码:

double d3=1.55e+20;
double d4 = 11.2;
int i = (int)d3;
int j = (int)d4;


按照浮点数到整数的转换定义,我们会截取浮点数的小数位而取其整数位,因此j今天得到11,而i会发生溢出现象,因为d3的整数部位远远超出了int类型的取值范围。

基本类型的数据转换一般来说都是会造成内存截断或者内存访问范围的扩张,除非是相同字节的类型转换,但仍旧会改变编译器对指针所指向的内存单元的解释方式。

让我们来看如下代码:

double d1 = 952.25;
int *p=(int*)&d1;
int sum=10;
double*p1=(double*)∑

对于这两类强制转换我们可以通过画图来观察:

通过此图我们发现,通过p访问指向的double类型是安全的,后面的四个字节的被”截断“了,但我们通过p的值是多少呢?会是我们想要的952吗?答案是否,我们所得到的是d1开头的4个字节中的内容。 

我们使用p1来访问sum时,会发现访问内存范围中的“扩张”,如果写入数据可能会发生错误。 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值