发现傻孩子的《深入浅出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:15 编辑
代码是没有错的,你遇到的问题是你不了解整形变量在内存中的表现形式:
1、正数如何表示
2、负数如何表示
当你了解这两点以后,这个结果你就不会奇怪了。
另外,你要注意上下文,这个技术是在介绍环形队列时候引入的,那么环形队列中下标会出现负数么?答案是否定的。
所以,考察应用范围,你扩大了测试的范围也是不合适的。
最后,当你还不确认的时候,直接下结论会闹笑话的……这种情况下,用不太确定的语气会好一点,你觉得呢? 呵呵,谢谢解答!
页:
[1]