文档详情

新编C语言程序设计教程练习二参考答案

汽***
实名认证
店铺
DOC
522.50KB
约23页
文档ID:445852837
新编C语言程序设计教程练习二参考答案_第1页
1/23

练习二2.1用计算机处理信息时为什么需要对信息进行数字化编码?答:现代计算机采用二进制形式表示数据和指令,计算机内部处理的所有数据都是经过数字化编码的二进制数据,数值、文字、图形等信息只有编码成二进制形式才能由计算机进行处理2.2编码数值型数据时需考虑哪三个方面的问题?答:1. 编码的长度2. 正负号的编码3. 小数点的编码2.3 求码长1个字节的原码、反码和补码形式的定点整数分别能编码整数的范围与个数答:原码:1111 1111 - 0111 1111 -127~127共255数反码:1000 0000 – 0111 1111 -127~127共255数补码: 1000 0000 – 0111 1111 -128~127共256数2.4求下列数的补码(码长1个字节)65 -1 123 -123 -128答:65:0100 0001-1:原码1000 0001反码1111 1110补码1111 1111123:0111 1011-123:原码1111 1011反码1000 0100补码1000 0101-128:原码不能用1字节表示反码同样补码1000 00002.5从负数的反码加1得补码的过程说明补码的符号位可以看作是特殊的数值位的理由。

提示:以码长1个字节为例,用127减去负数原码的数值位就得到了负数的反码)答:以-123为例原码1111 1011反码1000 0100补码1000 01010111 1111 127-1111 1011 -123 1000 0100 4 +1=5 1000 0101:-128+5=-1232.6求码长分别为2个和4个字节时第4题中几个数的补码,并分析码长变化时补码是如何变化的65 -1 123 -123 -128答:65:0000 0000 0100 0001-1:原码1000 0000 0000 0001反码1111 1111 1111 1110补码1111 1111 1111 1111123:0000 0000 0111 1011-123:原码1000 0000 0111 1011反码1111 1111 1000 0100补码1111 1111 1000 0101-128:原码1000 0000 1000 0000反码1111 1111 0111 1111补码1111 1111 1000 000065:0000 0000 0000 0000 0000 0000 0100 0001-1:原码1000 0000 0000 0000 0000 0000 0000 0001反码1111 1111 1111 1111 1111 1111 1111 1110补码1111 1111 1111 1111 1111 1111 1111 1111123:0000 0000 0000 0000 0000 0000 0111 1011-123:原码1000 0000 0000 0000 0000 0000 0111 1011反码1111 1111 1111 1111 1111 1111 1000 0100补码1111 1111 1111 1111 1111 1111 1000 0101-128:原码1000 0000 0000 0000 0000 0000 1000 0000反码1111 1111 1111 1111 1111 1111 0111 1111补码1111 1111 1111 1111 1111 1111 1000 0000变化规律为:正数前面补0,负数前面补1。

2.7用实例证明码长2个字节的补码形式整数的取值范围也构成一个环分析下面程序的输出结果 答:#include void main( ) { short i = 32767, j = -32768; printf("%hd+1=%hd\n", i, i+1); printf("%hd-1=%hd\n", j, j-1); } 当变量i和j的值为127和-128时,程序的运行结果又怎样?答:输出结果为:32767+1=-32768-32768-1=32767当变量i和j的值为127和-128时,程序的运行结果为:127+1=128-128-1=-129因为short型变量的取值范围为-32768到32767,所以值128和-129不会溢出2.8升序排列下面的整型字面量0xac 169 02530xac的值为172,0253的值为171升序排列为168,0253,0xac2.9编程输出下面整型字面量的十进制、八进制、十六进制形式用int型变量存储数据,但分别用〝%h?〞与〝%?〞两种格式输出,并注意两者的区别) 96, 0100347, 0xffff答:从输出可以看出:变量i、j、k的存储状态分别为:0000 0000 0000 0000 0000 0000 0110 00000000 0000 0000 0000 1000 0000 1110 01110000 0000 0000 0000 1111 1111 1111 11112.10在%和格式字符d(o,x)之间也可以插入一个正整数(m),指定输出数据所占的最小宽度。

分析下面程序的输出 #include void main( ) { short i = 12, j = 34; printf("%d%d\n", i, j); printf("%3d%4d\n", i, j); } 在%与m之间,还可以插入一个“-”号,表示左对齐输出在上面程序最后加一条语句printf(〝%-3d%-4d\n〞,i,j);再分析比较输出结果答:printf("%d%d\n", i, j);会连续输出变量ij的值,输出结果为1234printf("%3d%4d\n", i, j);中%3d意味变量i的值至少占3列右对齐,即空格124d%3d意味变量j的值至少占4列右对齐,即空格空格34输出结果为空格12空格空格34rintf(〝%-3d%-4d\n〞,i,j);中-要求左对齐,%-3d的输出为12空格输出结果为12空格34空格空格2.11有一内存空间的存储状态为11 11111111111111 ,该内存空间的值是多少?分析下面程序的运行结果include void main( ) { short i = -1; printf("%hd\n%hu\n", i, i); }printf函数中的格式字符必须与对应的变量类型一致吗?如果可以不一致,格式字符可以是任意的吗?在上面程序的最后加一条语句printf("%f\n〞,i);,再查看输出结果。

答:解码方式不同,内存空间中数据有不同的值程序中变量i所标示的内存空间的状态即如图所示当以%hd格式解码时,它的值为-1,当以%hu格式解码时,它的值为65535printf函数中的格式字符不必与对应的变量类型一致,对应的变量仅表示要解码的数据位于何处如何解码由printf函数中的格式字符决定,所谓的printf 函数是“我的地盘我作主”但是,格式字符也不可以是任意的以上面为例,补码形式的16个1,可以按无符号格式%hu解码,也可按有符号格式%hd解码,但不能以浮点型解码,无法把16个1按浮点型解码,因此printf("%f\n〞,i);的输出结果就出错2.12短整型(short)变量可以用无符号短整型格式(%hu)输出如上题中-1的输出值为65535,-2和-3的输出值是多少呢?验证你的分析,并总结一下短整型变量i为负值但用无符号短整型格式(%hu)输出时的输出规律答:-1:65535-2:65534-3:65533通过观察,规律为:变量i为负值但用无符号短整型格式(%hu)输出时的输出为65536+i理论证明:变量i为负,则符号位为1,按有符号数格式解码时这个1表示-32768;按无符号数格式解码时,这个1表示32768,两者相差65536。

原来:-32768+x=i(x=32768+i)现在值为32768+x,即32768+32768+i=65536+i2.13用二进制形式的科学计数法表示下面的数(尾数为纯小数)65535,125.125,125125125.125E3,123.456,123456初始化浮点数变量时一定会出现误差吗?什么情况下才会出现误差?用写成浮点数字面量形式(123.0)的短整型整数(123)来初始化单精度浮点数变量时会出现误差吗?答:65535=1111111111111111=0.1111111111111111E10000125.125=1111101.001=0.1111101001e111125125125.125E3=125125125125=1110100100010000010011110010000000101=0.1110100100010000010011110010000000101e100101123.456=1111011.0111010010111100011010101=0. 11110110111010010111100011010101e111123456=11110001001000000=0.11110001001000000e10001初始化浮点数变量时不一定会出现误差。

只有十进制数的小数部分不能精确转化(如123.456)或虽然可以精确转化但浮点数没有那么大的存储空间存储(如125125125.125E3可以精确转化但转化后要37位才能准确存储其尾数,将其存入float型变量时就肯定有误差了)短整型整数的取值范围为-32768到32767,且都能精确转化为二进制,当用指数形式表示时尾数最多要16位的存储空间,而float型的尾数有23位,可以存下,因此用写成浮点数字面量形式(123.0)的短整型整数(123)来初始化单精度浮点数变量时一定不会出现误差2.14指出下面数据中不合法的浮点数字面量233.0,791E+2, 2.e3, 2e3, 12e2.0, 3. ,0.791E-2, .8答:以.8为例,可以用下面的程序进制测试,能编译通过没有语法错误的就是合法的include void main( ) { float f = .8; printf("%e\n", f); }不合法的有:12e2.0有同学用程序#include void main( ) { float f; scanf("%f", &f); printf("%e\n", f); }测试时输入12e2.0,程序运行正确,就认为12e2.0也为合法的浮点型字面量。

出现这种情况与scanf函数有关,当它遇到非法字符时自动停止转换,这个例子中,scanf函数遇到小数点后就停止了转换。

下载提示
相似文档
正为您匹配相似的精品文档
相关文档