C语言数据转换时应注意的问题:
有符号数和无符号数之间的转换。例,由
signed
型转等长unsigned
型数据时,符号位成为数据的一部分,即负数转换位无符号数时,数值将发生变化。同理,由unsigned
转换为signed
时最高位为符号位,也可能会发生数值变化。short a = -10; //二进制形式 1111 1111 1111 0110 printf("%d\n",a); // -10 unsigned short b = a; //二进制形式 1111 1111 1111 0110 printf("%d",b); //65526
数据的截取与保留。当一个浮点数转换为整数时,浮点数的小数部分全部舍去,并按整数形式存储。但浮点数的整数部分不能超过整形数允许的最大范围,否则溢出。
float f = -10.120; short s = f; printf("%d",s);//-10
数据转换中的精度丢失。四舍五入会丢失一些精度,截去小数也会丢失一些精度。此外,数据由long型转换为flaot型或double型时,有可能在存储时不能准确地表示该长整数的有效数字,精度也会受到影响。
精度转换结果的不确定性。当较长的整数转换为较短的整数时,要将高位截去。例,long型转换为short型,只将低16位送去,这就会产生很大的误差。
计算机的数值数据是否都是二进制数
在计算机内部,数值表示由以下两大类。
- 直接用二进制数表示。分为有符号数和无符号数,有符号数又分为定点数表示和浮点数表示。无符号数用来表示无符号整数(如地址等信息)。
- 二进制编码的十进制数,一般采用BCD码,用来表示整数。
计算机中数值数据虽然都用二进制,但不完全都是二进制,也有用十进制表示。