- 论坛徽章:
- 0
|
暑假自学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 编辑 ] |
|