单选题
一个C语言程序在一台32位机器上运行。程序中定义了三个变量x、y、z,其中x和z为int型,y为short型。当x=127、y=-9时,执行赋值语句z=x+y后,x、y、z的值分别是______。
【正确答案】
D
【答案解析】[解析] 结合题干及选项可知,int为32位,short为16位:又因C语言的数据在内存中为补码形式,故x、y的机器数写为0000007F、FFF7H。执行z=x+y时,由于x为int型,y为short型,故需将y的类型强制转换为int型,在机器中通过符号位扩展实现,由于y的符号位为1,故在y的前面添加16个1,即可将y强制转换为int型,其十六进制形式为FFFFFFF7H。然后执行加法,即0000007FH+FFFFFFF7H=00000076H,其中最高位的进位1自然丢弃。
数据转换时应注意的问题有:
1)有符号数和无符号数之间的转换。例如,由signed型转化为等长unsigned型数据时,符号位成为数据的一部分,也就是说,负数转化为无符号数数值将发生变化。同理,由unsigned转化为signed时最高位作为符号位,也可能发生数值变化。
2)数据的截取与保留。当一个浮点数转化为整数时,浮点数的小数部分全部舍去,并按整数形式存储。但浮点数的整数部分不能超过整型数允许的最大范围。否则溢出。
3)数据转换中的精度丢失。四舍五入会丢失一些精度,截去小数也会丢失一些精度。此外,数据由long型转换为float或double型时,有可能在存储时不能准确地表示该长整数的有效数字,精度也会受到影响。
4)数据转换结果的不确定性。当较长的整数转换为较短的整数时,要将高位截去,例如,long型转换为short型,只将低16位送过去,这样就会产生很大的误差。浮点数降格时,如double型转换为float型,当数值超过了float型的表示范围时,所得到的结果将是不确定的。
对于此问题在常见问题与知识点的第2问中有另一角度的解析。