如果赋值运算符两侧的类型不一致,则系统在赋值时自动进行类型转换。转换的基本原则是右边的数值转化为左边变量的数据类型,再赋值给左边的变量。需要注意的是,如果右边的数值超过左边变量所能表达的数值范围,则对其进行适当的截取处理后再进行赋值。常见的赋值转换处理方法如表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。
以上的赋值规则看起来比较复杂,其实不同类型的整型数据间的赋值归根到底就是一条:按存储单元中的存储形式直接传递。只要学过补码知识,那么以上规则是不难理解的。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。