%d转换说明将其转换成字符7和
6, 并显示为76; %x转换说明把相同的值(01001100) 转换成十六进制记数法4c; %c转换说明把01001100转换成字符L。
1.转换不匹配
前面强调过, 转换说明应该与待打印值的类型相匹配。 通常都有多种选择。 例如, 如果要打印一个int类型的值, 可以使用%d、 %x或%o。 这些转换说明都可用于打印int类型的值, 其区别在于它们分别表示一个值的形式不同。 类似地, 打印double类型的值时, 可使用%f、 %e或%g。
混淆整型和浮点型, 结果更奇怪。
程序清单4.12 floatcnv.c程序 /* floatcnv.c -- 不匹配的浮点型转换 */#includeint main(void) { float n1 =3.0; double n2 =3.0; long n3 =2000000000; long n4 =1234567890; printf("%.1e %.1e %.1e %.1e\n", n1, n2, n3, n4); // 3.0e+00 3.0e+00 3.1e+46 1.7e+266printf("%ld %ld\n", n3, n4); // 2000000000 1234567890printf("%ld %ld %ld %ld\n", n1, n2, n3, n4); // 0 1074266112 0 1074266112return0; }
第1行输出显示, %e转换说明没有把整数转换成浮点数。
考虑一下, 如果使用%e转换说明打印n3(long类型) 会发生什么情况。 首先, %e转换说明让printf()函数认为待打印的值是double类型(本系统中double为8字节) 。当printf()查看n3(本系统中是4字节的值) 时, 除了查看n3的4字节外, 还会查看查看n3相邻的4字节, 共8字节单元。 接着, 它将8字节单元中的位组合解释成浮点数(如, 把一部分位组合解释成指数) 。 因此, 即使n3的位数正确, 根据%e转换说明和%ld转换说明解释出来的值也不同。 最终得到的结果是无意义的值。
第1行也说明了前面提到的内容: float类型的值作为printf()参数时会被转换成double类型。 在本系统中, fl