本帖最后由 XIANSir 于 2011-3-5 14:48 编辑
没耐心的请直接看第1楼的现象和第31楼我从汇编发现的问题——看看到底是不是BUG
又有最新进展,见39楼
事情明白了,的确是我对C的理解不到位造成的,并不是KEIL的BUG。详情见48楼。
另外,在47楼123jj前辈也给出了完全正确的解释,虽然我是自己想出问题所在的,不过还是非常感谢前辈的指点。
不过48楼还有一个比较棘手的问题,请高手再点拨点拨。
顺便为了21IC能够更好,提一个题外的建议:21IC的网站兼容性实在不佳啊,我一直都用GOOGLE浏览器,可是在谷歌浏览器里面网站提供的很多功能却没法使用——比如上传照片、修改帖子,害得我还得专门打开IE6去做这些事情。希望21IC能够改进这些问题——纯属建议,只为让21IC越来越好
问题已经解决,结论是:避免出现这种闹心问题的最好方法是对于位变量(bit变量和位域变量)只对其使用逻辑运算符,而不要对其使用按位运算符。
记住能够对位变量(bit变量和位域变量)应用哪些运算符的最简单方式是:把位变量看作是bool类型而不是整数类型。
结贴!!
在看过124楼前辈的发言之后,我深感惭愧,我不得不承认,我在此处以及63楼给的出结论都是根本性错误的,位域不该被看作是bool类型,位域其实就是数量类型(1位的整型类型)。
在标准C语言中,根本就没有布尔类型,而Keil C51中的bit类型与bool类型几乎完全相同,所以将bit类型当作bool类型来用基本上不用有任何的担心
这也就是为什么对bit变量应用按位取反和对位域变量应用按位取反时现象完全不同的根本原因:其实bool类型是不支持按位操作的,这也是为什么不说bit类型就是bool类型的原因,但是在Keil的实现中bit变量的按位取反操作效果和bool类型的逻辑取反操作效果完全相同。而位域呢,由于它本身是数量类型(1位整型),而标准C支持的CPU绝大多数都没有位处理机,所以对位域变量进行计算时必须扩展为char、int等类型然后进行计算,比如对于1位的位域pin.b_1进行按位取反,假设此位域值为1,那么按位取反后的结果在51上是0xFE,而在ARM7上为0xFFFFFFFE。
大家可以试一试,位域类型支持所有整型支持的运算符(我试过加法、乘法、按位取反、位移),但是bit连加法都不支持。
|