51程序小发现

[复制链接]
4013|22
 楼主| Imakey 发表于 2013-6-2 19:07 | 显示全部楼层 |阅读模式
今天调程序的时候发现了一个死循环,一直搞不明白;
循环的代码如下,大家看看

unsigned char i=3,j=0;
for(i=3;i>=0;i--)
{
    for(j=0;j<8;j++)
      {
       // add your code here
       }
}

keilV4调试发现这里是死循环,怎么回事???
wangch_sh 发表于 2013-6-2 20:13 | 显示全部楼层
把i>=0改为i>0.
蓝魔大师弟 发表于 2013-6-2 20:25 | 显示全部楼层
叶伤 发表于 2013-6-2 20:27 来自手机 | 显示全部楼层
uchar无符号字符类型,范围是0~255。到0后仍执行减一,变成255,大于0,继续循环。然后就死了。
 楼主| Imakey 发表于 2013-6-2 21:15 | 显示全部楼层
4楼正解,调试出来了,查看i的动态值发现是 0x03→0x02→0x01→0x00→0xFF→0xFD..........0x00→0xFF→..........
然后就死了,我还是不明白,怎么会这样?是编译器的问题??
wangch_sh 发表于 2013-6-2 21:41 | 显示全部楼层
程序问题。for循环不对,i从0到255一直大于等于0.
wangch_sh 发表于 2013-6-2 21:42 | 显示全部楼层
或者换成有符号字符型。
 楼主| Imakey 发表于 2013-6-2 21:51 | 显示全部楼层
嗯嗯,换成有符号的就行了。
elife 发表于 2013-6-2 22:06 | 显示全部楼层
这个要是编译器能警告一下就好了,好像"if(i=1) ..;"一样.
叶伤 发表于 2013-6-3 07:28 来自手机 | 显示全部楼层
把数字看成2进制,0=0000 0000,减一不够减,要借位,1 0000 0000- 1=0 1111 1111,高位丢弃,就变成了00h-1=ffh。255+1=0也一样,不过是进位。八位数据就把第九位之后的丢掉,就像溢出,十六位int就把第十七位丢弃,类推。
叶伤 发表于 2013-6-3 07:46 来自手机 | 显示全部楼层
好像解释错了。0-1用补码表示是0xff(带符号),用添1表示是0xff。可0-3补码是0xfd,添1是0xfc。不知道编译器是遵从哪种?哪位能试试?
huazhongwang 发表于 2013-6-3 09:55 | 显示全部楼层
好好看下数据结构吧
技美电子 发表于 2013-6-3 10:45 | 显示全部楼层
程序设计问题!v好好补补编程基础!
liuxiaoyun1210 发表于 2013-6-3 13:58 | 显示全部楼层
当i=0时,执行完后,i再减1,此时i=255,这样就是一个死循环。
gcxzhz 发表于 2013-6-3 14:59 | 显示全部楼层
unsigned int 是0-255  就不可能小于0
电子write_cai 发表于 2013-6-3 17:15 | 显示全部楼层
一般我是不会写成这样的程序。
tangzzbb 发表于 2013-6-3 18:08 | 显示全部楼层
养成一个好习惯,象for中的计数i采用有符号数,不要动不动就用无符号数,这样会带来很多好处,以后就体会到了。
cityant 发表于 2013-6-3 21:50 | 显示全部楼层
小鸟学习了!~
小营七郎 发表于 2013-6-3 22:13 | 显示全部楼层
学习了。
1230456 发表于 2013-6-3 22:17 | 显示全部楼层
哦~   学习了~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:联系邮箱 997494013@qq.com

76

主题

779

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部