piliyang1 发表于 2016-2-9 21:27:25

看明解C语言第3版入门篇第七章时遇到代码编译后运行不正常

本帖最后由 piliyang1 于 2016-2-9 21:30 编辑

我在读这本书第七章代码清单 7 - 6时我按照书里的代码写的然后运行以后是下边这样
并附上源码


/*
      时间:2016年2月7日16:24:58
      目的:按位运算符的初级使用
      始终未运行成功
*/
#include <stdio.h>

//返回整数x中设置的位数
int count_bits(unsigned x)
{
      int bits = 0;
      while (x)
      {
                if (x & 1U)
                        bits++;
                x >>= 1;
      }
      return bits;
}

//返回unsigned型的位数
int int_bits(void)
{
      return count_bits(-0U);
}

//显示unsigned型的位的内容
void print_bits(unsigned x)
{
      int i;
      for (i = int_bits() - 1; i >= 0;i--)
                putchar(((x>> i) & 1U) ?'1' : '0');
}

int main()
{
      unsigned a, b;
      
      printf("请输入两个非负整数。\n");
      printf("a : ");      scanf("%u", &a);
      printf("b : ");      scanf("%u", &b);
      
      printf("\na   = ");      print_bits(a);
      printf("\nb   = ");      print_bits(b);
      printf("\na & b = ");      print_bits(a & b);//a和b的逻辑与
      printf("\na ! b = ");      print_bits(a | b);//a和b的逻辑或
      printf("\na ^ b = ");      print_bits(a ^ b);//a和b的逻辑异或
      printf("\n~a    = ");      print_bits(~a);//a的反码
      printf("\n~b    = ");      print_bits(~b); //b的反码
      
      return 0;
}
/*
      在Dev-C++中的编译并运行的结果是:
---------------------------------
      请输入两个非负整数。
      a : 1963
      b : 12345
      
      a   =
      b   =
      a & b =
      a ! b =
      a ^ b =
      ~a    =
      ~b    =
---------------------------------
*/



而这本书自己写的运行结果是:
       请输入两个非负整数。
      a : 1963
      b : 12345
      
      a      =0000011110101011
      b      =0011000000111001
      a & b =0000000000101001
      a ! b   =0011011110111011
      a ^ b =0011011110010010
      ~a   =1111100001010100
      ~b   =1100111111000110

shuofxz 发表于 2016-2-9 21:27:26

第24行 -改成~ 对吧?
return count_bits(~0U);

piliyang1 发表于 2016-2-9 21:56:54

本帖最后由 piliyang1 于 2016-2-9 22:06 编辑

(⊙o⊙)…兄弟们我自己已经找到哪里出问题了,看你们的啦~看谁能拿到这20的悬赏分{:10_279:}只能说粗心出版商害死人啊

shuofxz 发表于 2016-2-12 00:14:07

我是查了一些资料发现那个问题的,仔细想了一下代码,发现有几处不太明白
return count_bits(~0U);
~0U我查到0U是代表无符号0,~0U是1吗?直接写1U不行吗?
还有~0U对应count_bits函数需要传入的参数unsigned x, 所以是x=~0U吗?
可是我直接打印的话,得到的是一个奇怪的数?
        unsigned x = ~0U;
        printf("%u", x);

piliyang1 发表于 2016-2-13 09:57:12

shuofxz 发表于 2016-2-12 00:14
我是查了一些资料发现那个问题的,仔细想了一下代码,发现有几处不太明白
return count_bits(~0U);
~0U   ...

这里我也是没有搞太明白,书上写的是0U代表的是最小的那个数字,比如我的是64位win10系统0U返回的就是
00000000000000000000000000000000
然后~0U返回的就是11111111111111111111111111111111
这样方便int couunt_bits函数计算总共有多少位,好像就是这个意思,我把书上这一块看了好几遍了,始终不太明白。。
页: [1]
查看完整版本: 看明解C语言第3版入门篇第七章时遇到代码编译后运行不正常