yikuang 发表于 2012-11-9 22:58:04

发现傻孩子的《深入浅出AVR单片机》书上有点小错误,不.....

发现傻孩子的《深入浅出AVR单片机》书上有点小错误,不知道是不是我理解有错。
在书上422页,利用求余算法将不同情况下的n限定在指定的范围内,实现环形结构。如果在这里的n值的取值范围是上文的两个互逆序数组:0,1,2,...9和 0,9,8,7...1
那么在这里的代码貌似有错误。我把代码放在VS2010上运行

#include <stdio.h>

#define BIT(i)            (1 << i)
#define CIRCLE_SIZE_BIT      3
#define CIRCLE_SIZE         BIT(CIRCLE_SIZE_BIT)
#define MOD(Value)          ((Value) & (BIT(CIRCLE_SIZE_BIT) - 1))

void main()
{
        char n;
        while(1)
        {
                scanf("%d",&n);
                n = (n >= 0)? MOD(n) : MOD(MOD(n) + (CIRCLE_SIZE));
                printf("i = %d",n);
    }
}





由此可见 n的范围始终限制在0~7 和7~0之间

不知是不是我理解有错,因为在研究傻孩子介绍的队列,也是一知半解。。。

Gorgon_Meducer 发表于 2012-11-10 14:11:47

本帖最后由 Gorgon_Meducer 于 2012-11-10 14:15 编辑

代码是没有错的,你遇到的问题是你不了解整形变量在内存中的表现形式:
1、正数如何表示
2、负数如何表示
当你了解这两点以后,这个结果你就不会奇怪了。

另外,你要注意上下文,这个技术是在介绍环形队列时候引入的,那么环形队列中下标会出现负数么?答案是否定的。
所以,考察应用范围,你扩大了测试的范围也是不合适的。

最后,当你还不确认的时候,直接下结论会闹笑话的……这种情况下,用不太确定的语气会好一点,你觉得呢?

yikuang 发表于 2012-11-11 12:31:52

呵呵,谢谢解答!
页: [1]
查看完整版本: 发现傻孩子的《深入浅出AVR单片机》书上有点小错误,不.....