本文共 1424 字,大约阅读时间需要 4 分钟。
实验目的:用printf函数正确输出整型变量的值时需要使用与变量类型相适应的格式字符串,如有符号数用%d、无符号数用%u,此外还需根据变量所标识存储单元的长度选用适当的修饰符。一般而言,short型用长度修饰符h,long型用长度修饰符l,int型不加。如果不匹配时会出现什么情况呢?这是本次实验需要解决的问题之一。长度修饰符对scanf函数有何影响是本次实验需要解决的另一个问题。
实验步骤:
1.分析下面程序的输出
#include <stdio.h>
void main()
{
long i, j, k;
i = 0x80000001;
j = 0x80008001;
k = 0x00008001;
printf("%ld,%ld,%ld\n", i, j, k);
printf("%hd,%hd,%hd\n", i, j, k);
}
long型变量 | i | j | k |
初始值为 | 0x80000001 | 0x80008001 | 0x00008001 |
存储状态为 |
|
|
|
以%ld格式预期的输出为 |
|
|
|
以%hd格式预期的输出为 |
|
|
|
以%ld格式实际的输出为 |
|
|
|
以%hd格式实际的输出为 |
|
|
|
分析:
由输出可知,用printf函数以%hd格式输出长度为4个字节的long型变量时,只有位于 的数据被解码,由于其它位数据的丢失,输出值与原值通常不同。
由此例可再次证明,输出数据时printf函数的输出仅与 有关。
2.填表并编程验证
short型变量 | i | j | k |
初始值为 | 0x0001 | 0x8001 | 0xffff |
存储状态为 |
|
|
|
以%hd格式预期的输出为 |
|
|
|
以%ld格式预期的输出为 |
|
|
|
以%hd格式实际的输出为 |
|
|
|
以%ld格式实际的输出为 |
|
|
|
分析:
以%ld格式输出长度为2个字节的short型变量时,printf函数“会”扩充数据,解码的数据将由2个字节变为4个字节。由实际的输出值(以%ld格式)与原值(以%hd格式)通常(相同/不同)可知,数据扩充的规律为 。
提示:
数据扩充的规律可参考练习2.6总结。
//长度修饰符对scanf函数有何影响?
3.填表并分析
long型变量 | i | j | k |
以%hx格式时输入 | 0x80000001 | 0x80008001 | 0x00008001 |
预期的存储状态为 |
|
|
|
实际的存储状态为 |
|
|
|
#include <stdio.h>
void main()
{
long i, j, k;
printf("%lx,%lx,%lx\n", i, j, k);
scanf("%hx%hx%hx", &i, &j, &k);
printf("%lx,%lx,%lx\n", i, j, k);
printf("%ld,%ld,%ld\n", i, j, k);
printf("%hd,%hd,%hd\n", i, j, k);
}
分析:
由第一条printf函数的输出可知,整型变量没有被赋值之前,VC6.0会将它们的存储状态预设为 。注意:VC6.0这样做只是为了方便观测数据,通常应认为没有被赋值的变量的值是随机的。
由第二条printf函数的输出可知,用scanf函数以%hd格式为长度为4个字节的long型变量输入数据时,只有位于 的数据被处理。
4.设计表格并编程验证,,用scanf函数以%ld格式为长度为2个字节的short型变量输入数据时会出现什么情况。
转载地址:http://sbdti.baihongyu.com/