单片机玩了很长时间,你可能真不知道247和-9在单片机区别

2020-01-30 13:53发布

单片机玩了很长时间,你可能真不知道247和-9在单片机区别  unsigned char 247    char -9   他们的存储值都为0xF7 仿真编译确实如此  
F7+F7=1EE           247 (F7) +247 (F7) =494(1EE) -9 (F7) +247 (F7) =238(EE)    这个真是巧合? 自然界真神奇
   下面的编译汇编一致 不知道单片机是怎么处理这个结果的。
  1. void main()
  2.         {
  3.        idata unsigned char a=247;
  4.       idata unsigned char b=247;
  5.       idata unsigned int c=0;

  6.        c=a+b;
  7. }
复制代码
  1. void main()
  2. {
  3. idata unsigned char a=247;
  4. idata  char b=-9;
  5. idata unsigned int c=0;

  6. c=a+b;
  7. }
复制代码 2.png (27.87 KB, 下载次数: 0) 下载附件 2013-4-4 23:51 上传
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
l1234564555
1楼-- · 2020-01-31 13:15
hhxb 发表于 2013-4-5 10:38
利用补码把加法和减法合并这是前辈天才的想法

了解 看编译器的结果: 如果我们自己写汇编,我们需要人为知道F7此时代表的是247 还是-9,相加减时要做出处理。
F7+F7=1EE           247 (F7) +247 (F7) =494(1EE)             -9 (F7) +247 (F7) =238(EE) 人为的需要确定是不是需要舍去进位1。

那如果写C编译器会这样处理,如果两者只是赋值不计算 其实ram里面都是一样的F7,如果计算,编译器会加上处理的。那个想法确实天才不可思议
wajlh
2楼-- · 2020-01-31 17:12
也不是天才吧。生活中很多例子的。最简单的就是时钟吧。讲补码的时候就是以时钟为例的,不过貌似现在有指针的时钟也不多了
barryliu
3楼-- · 2020-01-31 19:40
本帖最后由 barryliu 于 2013-4-6 13:12 编辑

楼主的问题出在这里:

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,结果就是你预期的了。
sgzzour
4楼-- · 2020-02-01 00:33
楼上正解。。。。。。
i_kkyu
5楼-- · 2020-02-01 04:19
 精彩回答 2  元偷偷看……
elecfun
6楼-- · 2020-02-01 05:25
任何数据在编译的时候都要能确定它的数据类型,不然这个数就是无意义的,就像LZ所说的这个问题。

一周热门 更多>