打印
[51单片机]

9句短话,藏大秘密

[复制链接]
2609|35
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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 一开始没理解,读完所有楼层你的话才幡然醒.
5
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]

使用特权

评论回复
6
justtest111| | 2015-11-9 08:29 | 只看该作者
i溢出了啊。

使用特权

评论回复
7
ayb_ice| | 2015-11-9 08:31 | 只看该作者
还大秘密,
都是基本概念而已

使用特权

评论回复
8
mcu5i51| | 2015-11-9 08:36 | 只看该作者
看看汇编,前面是UCHAR的,用A连加,后面是INT的,用R5R4相加

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

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        MOV          R7,A
;         if(i==Rev[0]+ Rev[1]+ Rev[2]+ Rev[3])
                        ; SOURCE LINE # 13
        MOV          A,Rev?041+01H
        MOV          R5,A
        MOV          A,Rev?041
        ADD          A,R5
        MOV          R5,A
        CLR          A
        RLC          A
        MOV          R4,A
        MOV          A,Rev?041+02H
        MOV          R2,#00H
        ADD          A,R5
        MOV          R5,A
        MOV          A,R2
        ADDC         A,R4
        MOV          R4,A
        MOV          A,Rev?041+03H
        ADD          A,R5
        MOV          R5,A
        MOV          A,R2
        ADDC         A,R4
        MOV          R4,A
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;       
        MOV          A,R7
        CJNE         A,AR5,?C0002
        MOV          A,R2
        CJNE         A,AR4,?C0002


使用特权

评论回复
9
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

应该是这样子,不谢。

使用特权

评论回复
10
冰零分子| | 2015-11-9 09:02 | 只看该作者
我是看标题进来的。

使用特权

评论回复
11
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型了吗?

使用特权

评论回复
12
ywlzh| | 2015-11-9 09:18 | 只看该作者
我用VC环境跟你编译了一下,答案是8,其实也好理解,8位无符号字符模长256,超过了便从零重新计数

QQ图片20151109091812.png (7.65 KB )

QQ图片20151109091812.png

QQ图片20151109091819.png (12.35 KB )

QQ图片20151109091819.png

使用特权

评论回复
13
冰零分子| | 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

使用特权

评论回复
14
eyesee2008| | 2015-11-9 09:43 | 只看该作者

使用特权

评论回复
15
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 ...

开什么玩笑,运算优先级你都搞错了

使用特权

评论回复
16
shauew| | 2015-11-9 10:15 | 只看该作者
xygyszb 发表于 2015-11-9 09:10
优先级不是这样的吧。不明白为什么if()里面的数据变成了int型?前面不是定义成了unchar型了吗?

...

嗯 刚刚应该编译一下 给忘了

使用特权

评论回复
17
shauew| | 2015-11-9 10:16 | 只看该作者
冰零分子 发表于 2015-11-9 09:20
我发现我确实遇到个逗比
逗比你好,每天进步一点点

哈哈 一下子给忘了 不过溢出从0计这个我是懂的

使用特权

评论回复
18
shauew| | 2015-11-9 10:16 | 只看该作者
ayb_ice 发表于 2015-11-9 09:52
开什么玩笑,运算优先级你都搞错了

:P:P:P:P
我知错了

使用特权

评论回复
19
xygyszb| | 2015-11-9 10:18 | 只看该作者
ywlzh 发表于 2015-11-9 09:18
我用VC环境跟你编译了一下,答案是8,其实也好理解,8位无符号字符模长256,超过了便从零重新计数 ...

那么Rev[0]+Rev[1]+Rev[2]+Rev[3]的值是多少呢?

使用特权

评论回复
20
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

粉丝