讨论转换说明的意义
- 转换说明巴以二进制格式储存在计算机的值转换为一系列字符以便于显示。例如:数字76在计算机内部的存储格式是二进制数01001100,%d转换说明将其转换为字符7和6,并显示为7和6;%x转换说明把相同的值(01001100)转换为十六进制计数法4c,%c转换说明吧01001100转换成字符L。
- 转换可能会误导读者认为原始值被替换成转换后的值。实际上,转换说明是翻译说明,%d的意思是“把给定的值翻译成十进制整数文本并打印出来”。
转换不匹配的现象出现
- 转换说明应该与待打印值的类型相匹配。
如果不匹配会怎么样:
- 请看输出的第4行,num变量对应的转换说明%hd和%hu输出的结果都是336,这没有任何问题,然而,第3行mnum变量对应的转换说明%u(无符号)输出的结果却为65200,并非期望的336,这是由于有符号的short-int类型的值在我们的参考系统中的表示方式所致。
首先,short-int类型大小是两个字节;其次,系统使用***二进制补码***来表示有符号的数。这种方法,数字0到32767(2的15次方减1)代表他们本身,而数值32768到65535则表示负数数字。其中,65534表示-2,以此类推,-336表示为65200(即65535-336)。所以被解释为有符号int时,65200代表-336,而被解释为无符号int型时65200则代表65200,一定要谨慎,一个数字可以被解释为两个值。 - 第二行演示了如果把一个大于225的值转换字符会发生什么情况。在我们的系统中,short-int是两个字节,char是一个字节。当printf使用%c打印336时,他只会查看储存336的两个字节中的后一个字节,
|336|0000000101010000 |
从00000001处截断
01010000