一个关于移位的问题

2019-03-24 09:33发布

本帖最后由 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,请大家帮我看一下,十分感谢
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
lcofjp
1楼-- · 2019-03-24 17:29
< 我今天闲的蛋疼帮你分析一下。
具体结果确实超乎想象,应该是编译器的问题,你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;
霹雳十
2楼-- · 2019-03-24 19:47
 精彩回答 2  元偷偷看……
le062
3楼-- · 2019-03-25 00:41
先说下是啥子编译器把
zhubeilife
4楼-- · 2019-03-25 06:38
lcofjp 发表于 2016-2-21 11:27
我今天闲的蛋疼帮你分析一下。
具体结果确实超乎想象,应该是编译器的问题,你debug一下跳到汇编看看到底 ...

谢谢分析!我按着改过来了!
zhubeilife
5楼-- · 2019-03-25 08:06
 精彩回答 2  元偷偷看……
zhubeilife
6楼-- · 2019-03-25 11:07
le062 发表于 2016-2-21 12:01
先说下是啥子编译器把

请问这个跟编译器有很大的关系是吗?

一周热门 更多>

相关问题

    相关文章