鱼C论坛

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

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

[复制链接]
发表于 2016-2-9 21:27:25 | 显示全部楼层 |阅读模式
20鱼币
本帖最后由 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

最佳答案

查看完整内容

第24行 -改成~ 对吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-2-9 21:27:26 | 显示全部楼层
第24行 -改成~ 对吧?
return count_bits(~0U);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

(⊙o⊙)…兄弟们我自己已经找到哪里出问题了,看你们的啦~看谁能拿到这20的悬赏分只能说粗心出版商害死人啊
想知道小甲鱼最近在做啥?请访问 -> 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吗?
可是我直接打印的话,得到的是一个奇怪的数?
        unsigned x = ~0U;
        printf("%u", x);
想知道小甲鱼最近在做啥?请访问 -> 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函数计算总共有多少位,好像就是这个意思,我把书上这一块看了好几遍了,始终不太明白。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-26 20:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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