2359|7

18

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

一个关于移位的问题 [复制链接]

本帖最后由 zhubeilife 于 2016-2-21 14:51 编辑 程序如下:
  1. <font size="4">unsigend char A,B,C;
  2. long int Resulst;
  3. A = 0xff;
  4. B = 0xff;
  5. C = 0xff; </font>
复制代码
如果表达式为:
  1. Result = (A<<16) + (B<<8) + C;
  2. 结果为:0x0000FFFF
复制代码
我发现因为是数据类型的原因,所以我加了强制类型转换,但是结果如下:
  1. Result = ((long int)A<<16) + (B<<8) + C;
  2. 结果为:0x00FEFFFF
复制代码
我一直没有想明白为啥得到的结果为FE,请大家帮我看一下,十分感谢

最新回复

看来还是跟运算优先级有关系的,一般为了避免这个或者为了不产生歧义,多加括号啦。  详情 回复 发表于 2016-2-21 22:11
 
点赞 关注

回复
举报

6041

帖子

193

TA的资源

版主

沙发
 
我今天闲的蛋疼帮你分析一下。
具体结果确实超乎想象,应该是编译器的问题,你debug一下跳到汇编看看到底是什么鬼,按理来说,这两个结果都是不对的,如果你所贴的代码和你实际运行的代码一样的话。
具体分析如下:
Result = A<<16 + B<<8 + C; 等价于Result = A<<(16+B)<<(8+C); => Result = A<<534;
第二个表达式为(long)A<<534;
具体结果超乎我的想想,我没记得C标准有过这方面的解释。但是无论怎样解释,似乎都得不到你编译器出来的结果。
所以,如果你不想深究,只是想得到正确的结果的话,就这么写:
Result = (A << 16UL) + (B<<8) + C;

点评

谢谢分析!我按着改过来了!  详情 回复 发表于 2016-2-21 15:03
 
 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
应该是运算符+比<<的优先级要高  这样改下试试
Result =( (long int)A<<16) +((int) B<<8) + C;

点评

谢谢分析!我按着改过来了!  详情 回复 发表于 2016-2-21 15:06
 
 
 

回复

750

帖子

3

TA的资源

版主

4
 
先说下是啥子编译器把

点评

请问这个跟编译器有很大的关系是吗?  详情 回复 发表于 2016-2-21 15:08
 
个人签名

要666

 
 

回复

18

帖子

0

TA的资源

一粒金砂(中级)

5
 
查看本帖全部讨论,请登录或者注册
 
 
 

回复

18

帖子

0

TA的资源

一粒金砂(中级)

6
 
查看本帖全部讨论,请登录或者注册
 
 
 

回复

18

帖子

0

TA的资源

一粒金砂(中级)

7
 
查看本帖全部讨论,请登录或者注册
 
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

8
 
查看本帖全部讨论,请登录或者注册
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
立即报名 | 2025 瑞萨电子工业以太网技术日即将开启!
3月-4月 深圳、广州、北京、苏州、西安、上海 走进全国6城
2025瑞萨电子工业以太网技术巡回沙龙聚焦工业4.0核心需求,为工程师与企业决策者提供实时通信技术最佳解决方案。
预报从速,好礼等您拿~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表