[51单片机] 9句短话,藏大秘密

[复制链接]
 楼主| hetiandemeng017 发表于 2015-11-8 21:46 | 显示全部楼层 |阅读模式
本帖最后由 hetiandemeng017 于 2015-11-8 21:57 编辑

keil中编译的单片机 遇到一条坎,求哥哥们扶一把!
废话少说,上着9句代码
#define  uchar unsigned char

void main()
{
        uchar i=0;
        uchar Rev[4];
          Rev[0]=0x00;
        Rev[1]=0x00;
        Rev[2]=0x09;
        Rev[3]=0xff;

        i=Rev[0]+ Rev[1]+ Rev[2]+ Rev[3];//0x08
        if(i==Rev[0]+ Rev[1]+ Rev[2]+ Rev[3])i=0xaa;
        while(1);
}

请问最后i是0xaa还是0x08?
为什么?
我知道答案,我不知道为什么。谢谢!

 楼主| hetiandemeng017 发表于 2015-11-8 21:47 | 显示全部楼层
自己顶一下,吸引大神路过
 楼主| hetiandemeng017 发表于 2015-11-8 21:58 | 显示全部楼层
我告诉大家答案吧:0x08
zcc330 发表于 2015-11-8 22:18 | 显示全部楼层
这个跟那个数据的格式有关,if判断句后面的数据不是uchar了 变成了int了 所以不等,你可以强制格式转换,加个(uchar)即可。

评分

参与人数 1威望 +3 收起 理由
hetiandemeng017 + 3 一开始没理解,读完所有楼层你的话才幡然醒.

查看全部评分

seifguo 发表于 2015-11-9 08:00 | 显示全部楼层
Rev[0]+ Rev[1]+ Rev[2]+ Rev[3]的值超过了uchar的范围,i是uchar类型,保存不了那么大的数,只保留Rev[0]+ Rev[1]+ Rev[2]+ Rev[3]的值的低8位。所以i!=Rev[0]+ Rev[1]+ Rev[2]+ Rev[3]
justtest111 发表于 2015-11-9 08:29 | 显示全部楼层
i溢出了啊。
ayb_ice 发表于 2015-11-9 08:31 | 显示全部楼层
还大秘密,
都是基本概念而已
mcu5i51 发表于 2015-11-9 08:36 | 显示全部楼层
看看汇编,前面是UCHAR的,用A连加,后面是INT的,用R5R4相加

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;         i=Rev[0]+ Rev[1]+ Rev[2]+ Rev[3];//0x08
  3.                         ; SOURCE LINE # 12
  4.         MOV          A,Rev?041
  5.         ADD          A,Rev?041+01H
  6.         ADD          A,Rev?041+02H
  7.         ADD          A,Rev?041+03H
  8. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;       

  9. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  10.         MOV          R7,A
  11. ;         if(i==Rev[0]+ Rev[1]+ Rev[2]+ Rev[3])
  12.                         ; SOURCE LINE # 13
  13.         MOV          A,Rev?041+01H
  14.         MOV          R5,A
  15.         MOV          A,Rev?041
  16.         ADD          A,R5
  17.         MOV          R5,A
  18.         CLR          A
  19.         RLC          A
  20.         MOV          R4,A
  21.         MOV          A,Rev?041+02H
  22.         MOV          R2,#00H
  23.         ADD          A,R5
  24.         MOV          R5,A
  25.         MOV          A,R2
  26.         ADDC         A,R4
  27.         MOV          R4,A
  28.         MOV          A,Rev?041+03H
  29.         ADD          A,R5
  30.         MOV          R5,A
  31.         MOV          A,R2
  32.         ADDC         A,R4
  33.         MOV          R4,A
  34. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;       
  35.         MOV          A,R7
  36.         CJNE         A,AR5,?C0002
  37.         MOV          A,R2
  38.         CJNE         A,AR4,?C0002


shauew 发表于 2015-11-9 08:59 | 显示全部楼层
答案应该是0xaa
原因在这一句if(i==Rev[0]+ Rev[1]+ Rev[2]+ Rev[3])
先计算条件值 i==Rev[0]+ Rev[1]+ Rev[2]+ Rev[3]
由于后面的式子没有加括号,所以从头计算
i==Rev[0] 为假 所以结果是0
在加上后面的0, 9和0xff,结果是一个非负的数,
所以if的条件为真
i=0xaa

应该是这样子,不谢。
冰零分子 发表于 2015-11-9 09:02 | 显示全部楼层
我是看标题进来的。
xygyszb 发表于 2015-11-9 09:10 | 显示全部楼层
shauew 发表于 2015-11-9 08:59
答案应该是0xaa
原因在这一句if(i==Rev[0]+ Rev[1]+ Rev[2]+ Rev[3])
先计算条件值 i==Rev[0]+ Rev[1]+ Rev ...

优先级不是这样的吧。不明白为什么if()里面的数据变成了int型?前面不是定义成了unchar型了吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
ywlzh 发表于 2015-11-9 09:18 | 显示全部楼层
我用VC环境跟你编译了一下,答案是8,其实也好理解,8位无符号字符模长256,超过了便从零重新计数

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
冰零分子 发表于 2015-11-9 09:20 | 显示全部楼层
shauew 发表于 2015-11-9 08:59
答案应该是0xaa
原因在这一句if(i==Rev[0]+ Rev[1]+ Rev[2]+ Rev[3])
先计算条件值 i==Rev[0]+ Rev[1]+ Rev ...

我发现我确实遇到个逗比
逗比你好,每天进步一点点
:handshake
eyesee2008 发表于 2015-11-9 09:43 | 显示全部楼层
ayb_ice 发表于 2015-11-9 09:52 | 显示全部楼层
shauew 发表于 2015-11-9 08:59
答案应该是0xaa
原因在这一句if(i==Rev[0]+ Rev[1]+ Rev[2]+ Rev[3])
先计算条件值 i==Rev[0]+ Rev[1]+ Rev ...

开什么玩笑,运算优先级你都搞错了
shauew 发表于 2015-11-9 10:15 | 显示全部楼层
xygyszb 发表于 2015-11-9 09:10
优先级不是这样的吧。不明白为什么if()里面的数据变成了int型?前面不是定义成了unchar型了吗?

...

嗯 刚刚应该编译一下 给忘了
shauew 发表于 2015-11-9 10:16 | 显示全部楼层
冰零分子 发表于 2015-11-9 09:20
我发现我确实遇到个逗比
逗比你好,每天进步一点点

哈哈 一下子给忘了 不过溢出从0计这个我是懂的
shauew 发表于 2015-11-9 10:16 | 显示全部楼层
ayb_ice 发表于 2015-11-9 09:52
开什么玩笑,运算优先级你都搞错了

:P:P:P:P
我知错了
xygyszb 发表于 2015-11-9 10:18 | 显示全部楼层
ywlzh 发表于 2015-11-9 09:18
我用VC环境跟你编译了一下,答案是8,其实也好理解,8位无符号字符模长256,超过了便从零重新计数 ...

那么Rev[0]+Rev[1]+Rev[2]+Rev[3]的值是多少呢?
shauew 发表于 2015-11-9 10:21 | 显示全部楼层
one more time
Rev[0]+ Rev[1]+ Rev[2]+ Rev[3] = 0x108
由于你定义了uchar 所以溢出部分归零
结果就是0x08
所以
i=Rev[0]+ Rev[1]+ Rev[2]+ Rev[3]              =>     i=0x08
但是
if(i==Rev[0]+ Rev[1]+ Rev[2]+ Rev[3])  

您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

99

帖子

1

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