免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 19307 | 回复: 75
打印 上一主题 下一主题

请高手解惑(谭浩强书中的习题及给出的答案不太理解) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-21 11:25 |只看该作者 |倒序浏览
暑假自学C语言(用谭浩强第三版),学到位操作了,做书中习题(P329 12.5题):
输入一个数的原码,求其补码。
我自己写了一个并在gcc下通过(我没有TURB C)
-----------------------------------------------
#include <stdio.h>
main()
{ int a,b;
  printf("请输入一个整数(可正可负):\n");
  scanf("%d",&a);
  if (a>=0)
      b=a;
  else
      b=~(-a)+1;//负数 绝对值之 按位取反 加1
  printf("%o\n",b);
}
-------------------------------------------
配谭书的答案书(从网上下的电子书) 给出如下代码,疑惑甚多,请高手解惑,
下面代码中的注解是我自己加上的。
main()
{ unsigned int a;
  unsigned int getbits(unsigned);
  printf("\n Input an octal number:");
  scanf("%o",&a);
  printf("result:%o\n",getbits(a));
}
unsigned int getbits(unsigned value)
{ unsigned int z; //Z为无符号整数
  z=value&0100000; //十六位二进制数,高位为1其他为0
  //目的是想看高位是否为1
  if (z==0100000) //高位为1,可是,既然是unsigned int 那也是正数
     z=~value+1;  //一个正数的补码是它本身?为何程序这么写
  else
     z=value;
  return(z);
}
书上提供的运行情况如下:(在turb C,想来TURB C unsigned int 应为16位)
input an octal number:2345
result:2345;
input an octal number:152525
result:25253
----------------------------------------------------------
基础知识:负数的补码计算办法
    = 二进制原码高位不变(即1) 余位按拉取反 再将所得+1
或者= 十进制的负数先取负数绝对值,转成二进制,按位取反,取后再加1
或者= 十进制负数+1 将所得十进制转为二进制,按位取反
明显:
谭书中z=~value+1;是按位取反加1不对。
后感:作者著书到后来,浮燥了。
谭书中有关文件那章有关文件复制时用feof()也是有问题的,给出的例子是错的
,表面上,目标文件中的内容与源文件一至,其实多出一个不可打印的 “y上有两点”也是
fgetc()取不出数据后返回的EOF,所以目标文件字节数比源文件要多,也就是flw所说的feof是蛇足,要用的话先fgetc() 再用feof()来测试。
想想那本书各高校基本上都有人用之当教科书,但清华大学出的书居然如此不严谨,
所以我老怀疑这本书上的东西(那怕它没有错)
目前发现前面各章写得最好,指针那章过后就不行了,浮燥了。

[ 本帖最后由 cviolet 于 2007-7-21 11:32 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-07-21 11:40 |只看该作者

回复 #1 cviolet 的帖子

不想再想了,希望高手能解释一下,将感激不尽,千万别看我的标题就认为是作业题,不理踩了。 昨晚看《快乐男生》 楚生胜出终成鸟人,高兴啊,可一想到弄不清楚醒套答案书的的代码,心里象被猫抓,难受。饿了,吃饭了。这个夏日为楚而生,这个夏日要把C语言搞清楚弄明白。呵。。。。。。:wink:

[ 本帖最后由 cviolet 于 2007-7-21 11:44 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2007-07-21 12:03 |只看该作者
找本好书看看吧

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2007-07-21 12:11 |只看该作者
原帖由 cviolet 于 2007-7-21 11:25 发表
暑假自学C语言(用谭浩强第三版),学到位操作了,做书中习题(P329 12.5题):
输入一个数的原码,求其补码。
我自己写了一个并在gcc下通过(我没有TURB C)
---------------------------------------------- ...

建议换本书。从楼主的引文(代码)来看,谭书的许多写法/做法都是相当不标准的,初学者用这本书害处太大了。

论坛徽章:
0
5 [报告]
发表于 2007-07-21 12:18 |只看该作者
原帖由 MMMIX 于 2007-7-21 12:11 发表

建议换本书。从楼主的引文(代码)来看,谭书的许多写法/做法都是相当不标准的,初学者用这本书害处太大了。

说实在的,国内也没有谁编的ansi C能超越谭老师。做人要厚道,评论不能失实。
但令人生气的是 谭老师的个人网站上居然没有交流的地方,书本上也没有留下交流邮件。
书的前言强调所有代码都经过严格测试了。哎,中国人啊,把书也当成免检产品了。
希望家分析一下谭老师的参考代码吧!不管他的代码规不规范先把他的思路掌握为好。
等掌握基本部分后,再看Unix 环境编程,买了,但还没有能力看。呵。。。。。。。。。。
欲速则不达,不急。

[ 本帖最后由 cviolet 于 2007-7-21 12:21 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2007-07-21 12:21 |只看该作者
MMMIX 推荐一本好书给楼主吧

论坛徽章:
0
7 [报告]
发表于 2007-07-21 12:23 |只看该作者

要不大家给出个好例子也行啊。

要不大家给出个好例子也行啊。

论坛徽章:
0
8 [报告]
发表于 2007-07-21 12:51 |只看该作者
千万不要用 谭浩强 的书,很多错

论坛徽章:
0
9 [报告]
发表于 2007-07-21 12:55 |只看该作者
CPL, 凭良心说, 翻译的质量还可以.

不过还是推荐你读英文....

论坛徽章:
0
10 [报告]
发表于 2007-07-21 13:01 |只看该作者
谭的这个例子是错误的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP