2.5.3 赋值运算中的类型转换
对于赋值表达式,也可能存在数据类型转换。
如果赋值运算符两侧的数据类型一致,不需要进行数据类型的转换。
如果赋值运算符两侧的数据类型不一致,需要将赋值运算符右边的表达式的类型转换为左边变量的类型(当然,是值之间的转换)。具体转换情况为
1.整型数与浮点型数间的转换
1)将浮点型数据(包括单、双精度)赋予整型变量时,舍弃浮点型数的小数部分。
2)将整型数据赋予浮点型(单、双精度)变量时,数值不变,但以浮点型数形式存储到变量中。
2.浮点型数间的转换
1)将一个double型数据赋予float变量时,截取其前7位有效数字,存放到float变量的存储单元(32位)中。但应注意数值范围不能溢出。例如:
float y;
double x=234.5634589e100;
y=x;
就会出现溢出错误。
2)将一个float型数据赋予double变量时,数值不变,有效位数扩展到16位,在内存单元中以64位(bit)存储。
3.整型数与字符型数间的转换
1)将字符型数据赋予整型变量时,由于字符型数据只占1个字节,而整型变量占2个字节(在Turbo C2.0环境下),因此将字符型数据(8位)放到整型变量的低8位中。有两种情况:
①如果所用系统将字符处理为无符号的量或对unsigned int型变量赋值,则将字符的8位放到整型变量的低8位,高8位补零。例如:将字符'\355'赋予int型变量x,如图2.5.2 (a)所示。
②如果所用系统(如Turbo C)将字符处理为带符号的量(即signed char),若字符最高位为0,则整型变量高8位补0;若字符最高位为1,则高8位全补1(如图2.5.2(b)所示)。这称为“符号扩展”,这样做的目的是使数值保持不变,如变量a(字符'\355')以整数形式输出为−19,x的值也是−19。
图2.5.2 字符型数转换为整型数
2)将一个int、short、long型数据赋予一个char型变量时,只将其低8位原封不动地送到char型变量(即截断)中即可。例如:
int i=568;
char j='c';
j=i;
赋值情况见图2.5.3。赋值后j的值为56,如果用“%c”输出,将得到字符‘8’。
图2.5.3 整型数转换为字符型数
4.整型数间的转换
1)将带符号的整型数据(int 型)赋予long型变量时,要进行符号扩展,将整型数的16位送到long型低16位中,如果int 型数据为正值(符号位为0),则long型变量的高16位补0;如果int 型变量为负值(符号位为1),则long型变量的高16位补1,以保持数值不改变。
2)若将一个long型数据赋予一个int 型变量,只将long型数据中低16位原封不动地送到int 型变量(即截断)。例如:
int i;
long j=255;
i=j;
赋值情况见图2.5.4。
图2.5.4 long型数255转换为整数
如果j=65530(八进制数0177772),则赋值后i值为−6。见图2.5.5。如果j=0177772(八进制数),赋值后i也为−6。请读者自己分析。
图2.5.5 long型数65530转换为整数
例2-4 有符号数据赋予无符号变量。
其中,%u是输出无符号数时所用的格式符。运行结果为:65535
如果j为正值,且在0~32 767之间,则赋值后数值不变。
不同类型的整型数据间的赋值归根结底就是:按存储单元中的存储形式直接传送。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。