关于C语言的数据类型的问题

①,对于有符号的整型数据和无符号的整型数据 ,一律使用 %ld 来输出结果。则是否会造成结果的错误?

②,对于浮点型,双精度和单精度,则一律使用 f% .则是否会造成结果的错误?

备注:结果能最大化的全部把数值显示出来,即使尾巴多几个0,则视为“对”。期间不能有四舍五入,截断,溢出现象。

接着问③,如果不考虑尾巴有几个0的前提下,无论有符号的整型数据,无符号的整型数据,浮点型,双精度和单精度 “全部”使用 f% .则是否会造成结果的错误?

备注:结果能最大化的全部把数值显示出来,即使尾巴多几个0,则视为“对”。期间不能有四舍五入,截断,溢出现象。
回答以上问题的时候,最好不能用简单的“可以“和“不可以”回答噢。最好回答出“为什么”?

这3个问题其实只是1个问题。知道printf中的输出格式控制符是独立于输出变量类型的就都解释清楚了,比如说格式控制符%ld是把对应的变量的“值”当作长整型来输出,而不管这对应的变量本来的类型是什么。所以:
①错:因为它会把一个较大的无符号数作为负数打印出来,比如
unsigned a=4294967290;
printf("%ld\n",a);
则输出是-6。
②对:因为C在内部计算浮点数时都是按double型操作的,只在输出时取不同精度。这里有个问题要明白,“精度”与输出小数点后位数并不是一回事,一个float变量同样可以由%.xf中的x控制输出10位、20位小数,但由于“精度”已被截断为6位,那么后续的数字就不可靠了……

③错:整型数是按补码存放的,浮点数是按阶码加尾数原码存放的,所以在%f控制下会把整型数补码值按“阶码加尾数原码”对待,输出自然是错误的。追问

::>_<::您太厉害了。我非常钦佩您。真的难以言表的敬佩您。
unsigned a=4294967290; 对于这个数,怎么才能让它正确的输出呢?您能写出完整的 printf的相关程序吗?谢谢。

追答

这很好写呀,用printf("%u\n",a);就可以了。

温馨提示:答案为网友推荐,仅供参考
相似回答