单片机玩了很长时间,你可能真不知道247和-9在单片机区别 unsigned char 247 char -9 他们的存储值都为0xF7 仿真编译确实如此
F7+F7=1EE 247 (F7) +247 (F7) =494(1EE) -9 (F7) +247 (F7) =238(EE) 这个真是巧合? 自然界真神奇
下面的编译汇编一致 不知道单片机是怎么处理这个结果的。
- void main()
- {
- idata unsigned char a=247;
- idata unsigned char b=247;
- idata unsigned int c=0;
- c=a+b;
- }
复制代码- void main()
- {
- idata unsigned char a=247;
- idata char b=-9;
- idata unsigned int c=0;
- c=a+b;
- }
复制代码
2.png (27.87 KB, 下载次数: 0)
下载附件
2013-4-4 23:51 上传
了解 看编译器的结果: 如果我们自己写汇编,我们需要人为知道F7此时代表的是247 还是-9,相加减时要做出处理。
F7+F7=1EE 247 (F7) +247 (F7) =494(1EE) -9 (F7) +247 (F7) =238(EE) 人为的需要确定是不是需要舍去进位1。
那如果写C编译器会这样处理,如果两者只是赋值不计算 其实ram里面都是一样的F7,如果计算,编译器会加上处理的。那个想法确实天才不可思议
楼主的问题出在这里:
01.void main()
02. {
03. idata unsigned char a=247;
04. idata unsigned char b=247;
05. idata unsigned int c=0;
06.
07. c=a+b;
08.}
找本C语言书了解一下类型转换的部分。
-9与247只有在单字节时才是相等的,在2字节时是不相等的。而你的变量c定义的是uint,你运算式里对应-9常数是ff f7,不是00 f7,而你的程序里,运行到这一步时,你以为的"-9"显然是00 f7,也就是+247,所以。。。
你把c改回uchar,结果就是你预期的了。
一周热门 更多>