鱼C论坛

 找回密码
 立即注册
查看: 2305|回复: 4

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

[复制链接]
发表于 2016-2-9 21:27:25 | 显示全部楼层 |阅读模式
20鱼币
本帖最后由 piliyang1 于 2016-2-9 21:30 编辑

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


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

  7. //返回整数x中设置的位数
  8. int count_bits(unsigned x)
  9. {
  10.         int bits = 0;
  11.         while (x)
  12.         {
  13.                 if (x & 1U)
  14.                         bits++;
  15.                 x >>= 1;
  16.         }
  17.         return bits;
  18. }

  19. //返回unsigned型的位数
  20. int int_bits(void)
  21. {
  22.         return count_bits(-0U);
  23. }

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

  31. int main()
  32. {
  33.         unsigned a, b;
  34.         
  35.         printf("请输入两个非负整数。\n");
  36.         printf("a : ");        scanf("%u", &a);
  37.         printf("b : ");        scanf("%u", &b);
  38.         
  39.         printf("\na     = ");        print_bits(a);
  40.         printf("\nb     = ");        print_bits(b);
  41.         printf("\na & b = ");        print_bits(a & b);//a和b的逻辑与
  42.         printf("\na ! b = ");        print_bits(a | b);//a和b的逻辑或
  43.         printf("\na ^ b = ");        print_bits(a ^ b);//a和b的逻辑异或
  44.         printf("\n~a    = ");        print_bits(~a);//a的反码
  45.         printf("\n~b    = ");        print_bits(~b); //b的反码
  46.         
  47.         return 0;
  48. }
  49. /*
  50.         在Dev-C++中的编译并运行的结果是:
  51. ---------------------------------
  52.         请输入两个非负整数。
  53.         a : 1963
  54.         b : 12345
  55.         
  56.         a     =
  57.         b     =
  58.         a & b =
  59.         a ! b =
  60.         a ^ b =
  61.         ~a    =
  62.         ~b    =
  63. ---------------------------------
  64. */
复制代码




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

最佳答案

查看完整内容

第24行 -改成~ 对吧?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-2-9 21:27:26 | 显示全部楼层
第24行 -改成~ 对吧?
  1. return count_bits(~0U);
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-2-9 21:56:54 | 显示全部楼层
本帖最后由 piliyang1 于 2016-2-9 22:06 编辑

(⊙o⊙)…兄弟们我自己已经找到哪里出问题了,看你们的啦~看谁能拿到这20的悬赏分只能说粗心出版商害死人啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-2-12 00:14:07 | 显示全部楼层
我是查了一些资料发现那个问题的,仔细想了一下代码,发现有几处不太明白
return count_bits(~0U);
~0U  我查到0U是代表无符号0,~0U是1吗?直接写1U不行吗?
还有~0U对应count_bits函数需要传入的参数unsigned x, 所以是x=~0U吗?
可是我直接打印的话,得到的是一个奇怪的数?
  1.         unsigned x = ~0U;
  2.         printf("%u", x);
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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函数计算总共有多少位,好像就是这个意思,我把书上这一块看了好几遍了,始终不太明白。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-21 21:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表