理论教育 C语言程序设计:赋值表达式类型转换

C语言程序设计:赋值表达式类型转换

时间:2023-11-02 理论教育 版权反馈
【摘要】:当赋值运算符左边变量的数据类型与右边表达式的数据类型不同时,需要进行数据类型转换。也就是说,若赋值运算符左侧变量所占内存空间小于右侧表达式的数据类型所占内存空间,则可能丢失数据。6)unsigned型数据赋给占二进制位数相同的其他整型变量将unsigned型数据的内容原样送到其他整型变量中,如果范围超过其他整型变量允许的范围,则会出错。

C语言程序设计:赋值表达式类型转换

赋值运算符左边变量的数据类型与右边表达式的数据类型不同时,需要进行数据类型转换。系统会把右边的数据转换成左边数据类型的数据。

类型转换后,可能会发生数据丢失现象。例如,赋值运算符的左侧为short型,右侧为long型,由于long型在内存中所占二进制位数是32位,而short型在内存中所占二进制位数是16位,使得long型的高16位无法复制到short型变量所占内存中,因此可能丢失数据。

也就是说,若赋值运算符左侧变量所占内存空间小于右侧表达式的数据类型所占内存空间,则可能丢失数据。例如,赋值运算符左侧为short型,右侧为int型,就可能丢失数据;赋值运算符左侧为char型,右侧为整型或实型,就可能丢失数据;赋值运算符左侧为float型,右侧为double型,就可能丢失数据。

下面分几种情况讨论。

1)字符型数据赋给整型变量

字符型数据在内存中占8位,而整型变量在内存中至少占16位,因此将字符型数据的8位放到整型变量的低8位中。对整型变量的其他位,Visual C++和C-Free都根据字符型数据的最高位的值来决定补1或补0。若字符型数据的最高位是0,则对整型变量的其他位补0;若字符型数据的最高位是1,则对整型变量的其他位补1。

2)整型(int、short、long)数据赋给字符型变量

由于字符型数据在内存中占8位,所以只将整型数据的低8位送到字符型变量中。

3)short型数据赋给long型变量

将short型数据的16位二进制代码送到long型变量的低16位中,如果short型数据值为正(符号位是0),则long型变量的高16位补0;如果short型数据值为负(符号位是1),则long型变量的高16位补1。对高16位补0(或1)称为符号扩展。

4)long型数据赋给short型变量

只将long型数据中的低16位送到short型变量中。

5)unsigned short型数据赋给long型变量

此时不存在符号扩展问题,只需将long型变量的高位补0。(www.daowen.com)

6)unsigned型数据赋给占二进制位数相同的其他整型变量

将unsigned型数据的内容原样送到其他整型变量中,如果范围超过其他整型变量允许的范围,则会出错。例如,a是unsigned short型变量,a=65535,而b是short型变量,若执行“b=a;”,则由于a的二进制形式是11111111 11111111,所以b的二进制形式也是11111111 11111111,而且由于最高位(符号位)是1,因此b成了负数,根据补码知识可知b是-1,执行“printf("%d",b);”将输出“-1”。

7)非unsigned型的整型数据赋给占二进制位数相同的unsigned型变量

此时也是原样赋值即(最高的符号位也一起传送)。例如,a是unsigned short型变量,b是short型变量,b=-1,若执行“a=b;”,则由于b的二进制形式是11111111 11111111,所以a的二进制形式也是11111111 11111111,执行“printf("%d",a);”将输出“65535”。

其他各种整型数据间转换的方法与上面基本相同,可总结为,将占位数少的变量赋值给占位数多的变量时,原值传送到占位数多的变量的低位。注意:其他高位的符号扩展;将占位数多的变量赋值给占位数少的变量时,可能丢失数据。

8)整型数据赋给实型变量

系统将整型数据转换成单精度(或双精度)实型数据,保持数值不变,赋值给实型变量。

9)实型数据赋给整型变量

将单精度(或双精度)实型数据赋给整型变量时,舍弃实型数据的小数部分,将整数部分赋给整型变量。例如,若n是int型变量,则执行“n=2.59;”的结果是n的值为2,执行“printf("%d",n);”将输出“2”。

10)float型数据赋给double型变量

此时保持数值不变,存放到double型变量中,在内存中以64位二进制形式存储。

11)double型数据赋给float型变量

此时截取double型数据的前7位有效数字,存放到float型变量中,在内存中以32位二进制形式存储。此时可能丢失数据,注意数值范围不要溢出。

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

我要反馈