理论教育 C语言赋值转换-类型自动转换与符号扩展

C语言赋值转换-类型自动转换与符号扩展

时间:2023-11-21 理论教育 版权反馈
【摘要】:如果赋值运算符两侧的类型不一致,则系统在赋值时自动进行类型转换。表2-6常见的赋值转换处理方法表2-6中,不易理解的部分以int型数据占4个字节为例进行说明。2)如果所用系统将字符处理为带符号的量,那么若字符最高位为0,则整型变量高24位补0;若字符最高位为1,则整型变量高24位全补1,称为符号扩展。例2.5 无符号短整型数据赋给有符号的短整型变量。

C语言赋值转换-类型自动转换与符号扩展

如果赋值运算符两侧的类型不一致,则系统在赋值时自动进行类型转换。转换的基本原则是右边的数值转化为左边变量的数据类型,再赋值给左边的变量。需要注意的是,如果右边的数值超过左边变量所能表达的数值范围,则对其进行适当的截取处理后再进行赋值。常见的赋值转换处理方法如表2-6所示。

表2-6 常见的赋值转换处理方法

表2-6中,不易理解的部分以int型数据占4个字节为例进行说明。

(1)字符型数据赋给整型变量时,由于字符只占一个字节,而整型变量占4个字节,因此将字符型数据(8位)放到整型变量低8位中,整型变量其余位的赋值有以下两种情况:

1)如果所用系统将字符处理为无符号的字符类型,则将字符的8位放到整型变量低8位,整型变量高24位补零,称为零扩展。例如,将字符变量ch(值为'\375' )赋给int型变量k1,如图2-9所示,变量ch(值为'\375')以十进制整数形式输出为253, k1的值也是253 。

2)如果所用系统将字符处理为带符号的量,那么若字符最高位为0,则整型变量高24位补0;若字符最高位为1,则整型变量高24位全补1,称为符号扩展。这样做的目的是使数值保持不变。例如,将字符变量ch(值为'\375')赋给int型变量k2,如图2-10所示,变量ch(值为'\375')以十进制整数形式输出为-3, k2的值也是-3。

图2-9 零扩展示意图

图2-10 符号扩展示意图

(2)实型数据(包括单、双精度浮点型)赋给整型变量时,舍弃实数的小数部分。如y为整型变量,执行“y=1.56”后y的值为1。

(3)整型数据赋给字符型变量时,由于字符只占一个字节,而整型变量占4个字节,因此将整型数据低8位放到字符型变量中,其余位舍弃。

(4)整型数据赋给单、双精度浮点型变量时,数值不变,用0补足小数位,并以浮点型数据的存储格式存储到系统给变量分配的存储单元中。如将18赋给float型变量f,即执行“f= 18;”运算,则先将18转换成18.000000,再存储到f中。

(5)有符号的整型数据(int型)赋给unsigned int型变量时,赋值不变,将int型数据的32位全送到unsigned int型变量中。如果int型数据为负值(符号位为1),则unsigned int型变量的高位也为1,此时高位的1作为数值位。

例2.4 有符号的整型数据(int型)赋给unsigned int型变量。

编写程序:(www.daowen.com)

创建一个名为“eg2_4.c”的新文件,在编辑窗口中输入下面的程序代码。

运行结果:

程序说明:

由于b的值为-1,它在内存中的存储形式为1111 1111 1111 1111 1111 1111 1111 1111(-1的补码,32个1),将b直接传递到a中,而a是unsigned int型数据,无符号位,因此a的值为4294967295,即232-1。如果b为正值,且在0~2147483647之间,则赋值后数值不变。

例2.5 无符号短整型数据(unsigned short int型)赋给有符号的短整型变量(short int型)。

编写程序:

创建一个名为“eg2_5.c”的新文件,在编辑窗口中输入下面的程序代码。

运行结果:

程序说明:

由于a在内存中的存储形式为1111 1111 1111 1111(-1的补码,16个1),将a直接传递到b中,而b是short int型数据,有符号位,因此b的值为-1。

以上的赋值规则看起来比较复杂,其实不同类型的整型数据间的赋值归根到底就是一条:按存储单元中的存储形式直接传递。只要学过补码知识,那么以上规则是不难理解的。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈