请问在Keil C51的for循环参数里左移最大只能15位吗?

2020-01-13 18:24发布

如题,如下面的程序中:

  1. void main(void) {
  2.         unsigned char ucI;

  3.         unsigned long ulTemp = 0x80000000;

  4.         Initial_System();        /** 系统初始化 */

  5.         for(ucI = 0; ucI < 32; ucI ++) {
  6.                 if(ulTemp & (1 << ucI)) {
  7.                         HD44780_Display_Hex(0, 0, ucI / 10);        /** 显示ucI的值,十位 */
  8.                         HD44780_Display_Hex(0, 1, ucI % 10);        /** 显示ucI的值,个位 */
  9.                 }
  10.         }

  11.         while(1);
  12. }
复制代码

按照道理,应当1左移31次时和0x80000000相与,if里才为真才对,但是实际运行却是左移15次的时候为真。运行结果如下图:

3.png (5.3 KB, 下载次数: 0) 下载附件 2018-11-21 01:09 上传

请问我的程序逻辑有问题吗?还是到底是什么问题?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
mangolu
1楼-- · 2020-01-14 15:07
本帖最后由 mangolu 于 2018-11-21 11:30 编辑
laoshuhunya 发表于 2018-11-21 11:10
为避免下次再掉坑,建议你用 1uL


已改,谢谢!

  1.         HD44780_Display_String(0,0,""1"  Size: ");
  2.         HD44780_Display_String(1,0,""1UL"Size: ");

  3.         HD44780_Display_Hex(0,11,sizeof(1));

  4.         HD44780_Display_Hex(1,11,sizeof(1UL));
复制代码

laoshuhunya
2楼-- · 2020-01-14 17:02
mangolu 发表于 2018-11-21 11:21
已改,谢谢!

在意存储空间的话可以这样: (unsigned  long)1
mangolu
3楼-- · 2020-01-14 22:16
 精彩回答 2  元偷偷看……
laoshuhunya
4楼-- · 2020-01-15 03:17
mangolu 发表于 2018-11-21 13:53
(unsigned long)1 和 1UL有什么区别?强制类型转换是使用过程中才转换,实际存储还是int类型存储? ...

是的~                          
mangolu
5楼-- · 2020-01-15 04:02
laoshuhunya 发表于 2018-11-21 14:35
是的~

哦,原来如此,谢谢!
techbaby
6楼-- · 2020-01-15 07:15
哈哈哈,曾经也掉过这个坑!

一周热门 更多>