计算机组成原理2-5:C语言中的数据类型及转换
本文系统介绍了C语言中的数据类型转换机制,主要包括整型和浮点型数据的转换规则。在整型转换中,详细分析了相同字长、小字长转大字长(0扩展/符号扩展)和大字长转小字长(截断处理)的转换方式及可能出现的溢出问题。在浮点型转换部分,重点阐述了float与double之间转换时的精度变化,以及浮点数与整型相互转换时的截断规则和精度损失问题。文章通过实例说明不同类型转换时的数据表示范围变化,强调程序员需要特别
目录
计算机中的数据类型
计算机中的数据以二进制的形式存储在寄存器或存储器中

机器怎么知道这些数据是定点数还是浮点数?
如果是定点数,是有符号数还是无符号数?

C语言中整型变量的取值范围
以char(8 位)型变量为例


无论是无符号数还是有符号数,C语言程序并不检测数据在加、减、乘等运算中产生的溢出现象
程序员应尽量避免出现这种情况,所编制的应用程序应具有对溢出进行判断的功能
C语言中数据类型转换

整形数据之间的转换

相同字长之间的转换





真题1

真题2

小字长转大字长
原数据为无符号类型,进行0扩展


原数据为有符号类型,进行符号扩展


真题1

大字长转小字长
一般情况下:编译器会将机器码截短处理
表示范围缩小,很可能出错

总结

int、float、double之间的转换

float → double

由于double型数据的阶码和尾数的位数都比float型大,因此其表示范围更大、精度更高,转换后的double型数据与原float型数据的值完全相等
double → float
大数转换:可能发生溢出。例如:double d=1234567890123456,float f =(float) d;
高精度数转换:发生舍入。例如:double d=1.123456789,float f =(float) d;
float/double - int
小数部分:向0方向截断
大数转换:可能发生溢出
int → float
两种类型都是32位,各自的数据组合(状态)数量相同,但二者在数轴上表示的数据并不完全重叠
由于float型浮点数的尾数包括隐藏位在内共24位,当int型数据的高8位(24~31位)数据为非0时,无
法精确转换成24位浮点数的尾数,此时发生精度溢出
int → double
double型数据的尾数包含隐藏位在内有53位,可以精确表示所有32位整数
总结

实例


DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)