OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2779|回复: 14

add=?????????????????????

[复制链接]

49

主题

160

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2017-11-2
在线时间
41 小时
发表于 2018-5-11 10:20:20 | 显示全部楼层 |阅读模式
10金钱
unsiggned  char  a,b;
a=123;
b=100;

unsigned short add;
                add=a<<8+b;


add=?????????????????????

最佳答案

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4910
金钱
4910
注册时间
2017-7-6
在线时间
720 小时
发表于 2018-5-11 10:20:21 | 显示全部楼层
criseyu 发表于 2018-5-11 11:29
add=123*256+100=31588  左移一位相当于该数乘以2,左移2位相当于该数乘以2^2=4,左移8位相当于该数乘以 2^8 ...

兄弟 等于0啊
我是小白,很白很白的小白!!!
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4910
金钱
4910
注册时间
2017-7-6
在线时间
720 小时
发表于 2018-5-11 11:01:24 | 显示全部楼层
本帖最后由 程功之道 于 2018-5-11 11:05 编辑

兄弟 你上面的unsigned多打了个g,还有你那个add下面的运算,有优先级问题,最好加挂号程序仿真一下不就知道,或者算下
我是小白,很白很白的小白!!!
回复

使用道具 举报

7

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
444
金钱
444
注册时间
2015-3-25
在线时间
129 小时
发表于 2018-5-11 11:29:45 | 显示全部楼层
本帖最后由 criseyu 于 2018-5-11 13:34 编辑

                                                              
回复

使用道具 举报

4

主题

380

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3088
金钱
3088
注册时间
2015-10-17
在线时间
320 小时
发表于 2018-5-11 11:40:45 | 显示全部楼层
本帖最后由 hgr211 于 2018-5-11 11:49 编辑

+ 优先级高于<<,a<<108,如果左移补0,a是uchar就是0 add=0
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4910
金钱
4910
注册时间
2017-7-6
在线时间
720 小时
发表于 2018-5-11 12:01:53 | 显示全部楼层

是的,这个改成这样add=(a<<8)+b; 我疑问,a不是char类型吗?a<<8左移8位不是为0吗?
我是小白,很白很白的小白!!!
回复

使用道具 举报

4

主题

380

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3088
金钱
3088
注册时间
2015-10-17
在线时间
320 小时
发表于 2018-5-11 12:13:42 | 显示全部楼层
超了8都是0了。习惯打上括号,就不用管运算优先级了。这个应该自己去看运算优先级以及运算中隐式转换的规则。例如int除以int要想得到double结果,int要强制转下,或者乘以个1.0隐式转换下.
回复

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8021
金钱
8021
注册时间
2014-8-13
在线时间
1595 小时
发表于 2018-5-11 12:39:31 | 显示全部楼层
这种题目估计是只有考试中才能出现的题目。现实开发会被怼死的。
虽然C/C++标准能给你准确答案,但是Turbo C   VC  GCC 等等编译器对这类问题有不同的定义的,
也就是说你同样的代码在不同编译器下运行的结果会是不一样的。

刚离校的学生特别愿意搞这样的事情,一般就警告一次,确保他明白不能这样搞,再出现就直接开了,
找人事投诉都没用,天之骄子整天劲劲的情怀什么的都没用。

另外,这种bug属于比较难排除的。
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4910
金钱
4910
注册时间
2017-7-6
在线时间
720 小时
发表于 2018-5-11 13:37:25 | 显示全部楼层
hgr211 发表于 2018-5-11 12:13
超了8都是0了。习惯打上括号,就不用管运算优先级了。这个应该自己去看运算优先级以及运算中隐式转换的规则 ...

a<<8哪里有隐式规则?a是8位,左移8位,a<<8不就是0,我仿真了  跟左边的寄存器类型有关?
我是小白,很白很白的小白!!!
回复

使用道具 举报

7

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
444
金钱
444
注册时间
2015-3-25
在线时间
129 小时
发表于 2018-5-11 13:51:15 | 显示全部楼层

额,以前一直以为 <<运算符优先级高,  碰到这种还是加括号比较好,稍不留神就错了,还不容易查找原因, 两种优先级算出来分别是7B64(31588) 和 0
TIM截图20180511134757.png
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4910
金钱
4910
注册时间
2017-7-6
在线时间
720 小时
发表于 2018-5-11 14:01:48 | 显示全部楼层
hgr211 发表于 2018-5-11 12:13
超了8都是0了。习惯打上括号,就不用管运算优先级了。这个应该自己去看运算优先级以及运算中隐式转换的规则 ...

                a=123;
                b=7;
                add=a<<8+b;
                b=2;
你这样改下,b只要大于0小于8,就不会是0,也就是说跟左边寄存器的类型有关,我的疑问是a是8位的类型,如果是改成add=(a<<8)+b这样;左移8位后a<<8竟然不等于0,这个a是char类型,并不是8位的,但是我赋值把这个a<<8给char类型的寄存器,就是0,给16位的寄存器就不是0?
我是小白,很白很白的小白!!!
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4910
金钱
4910
注册时间
2017-7-6
在线时间
720 小时
发表于 2018-5-11 14:07:02 | 显示全部楼层
hgr211 发表于 2018-5-11 12:13
超了8都是0了。习惯打上括号,就不用管运算优先级了。这个应该自己去看运算优先级以及运算中隐式转换的规则 ...

难道说不管这个a的类型是什么,它只是一个数而已,不管他的类型,指管赋值给其他寄存器的类型?还是你说的那个隐式转换问题?
1526018677(1).jpg
1526018715(1).jpg
我是小白,很白很白的小白!!!
回复

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2018-5-11 22:15:13 | 显示全部楼层
mack13013 发表于 2018-5-11 12:39
这种题目估计是只有考试中才能出现的题目。现实开发会被怼死的。
虽然C/C++标准能给你准确答案,但是Turbo ...

我们也是,a++之类的都要单独一行
回复

使用道具 举报

4

主题

380

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3088
金钱
3088
注册时间
2015-10-17
在线时间
320 小时
发表于 2018-5-14 12:04:59 | 显示全部楼层
程功之道 发表于 2018-5-11 14:07
难道说不管这个a的类型是什么,它只是一个数而已,不管他的类型,指管赋值给其他寄存器的类型?还是你说 ...

我不是说这道题,我只说运算注意的事项。运算中如果int除以int,结果也是一个int.你得不到一个double。
比如double a ;a=5/3,a=5.0/3, 大部分编译器的的结果不同。
不说了,等下被人怼
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4910
金钱
4910
注册时间
2017-7-6
在线时间
720 小时
发表于 2018-5-14 14:58:13 | 显示全部楼层
hgr211 发表于 2018-5-14 12:04
我不是说这道题,我只说运算注意的事项。运算中如果int除以int,结果也是一个int.你得不到一个double。
...

这个知道 要int/inty要得到小数,就要强制转换
我是小白,很白很白的小白!!!
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-7 22:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表