请问在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-13 23:57
特意去Keil官网看了,Keil C51确实支持unsigned long类型,并且是4字节阿:

http://www.keil.com/support/man/docs/c51/c51_le_datatypes.htm

4.png (43.28 KB, 下载次数: 0)

下载附件

2018-11-21 01:17 上传

takashiki
2楼-- · 2020-01-14 02:14
你知道1 << ucl是什么数据类型不?请改为1L << ucl。
mangolu
3楼-- · 2020-01-14 03:34
takashiki 发表于 2018-11-21 06:37
你知道1

哦,谢谢!原来如此。

那么,在keil c51中,未指定类形的,默认是int了?
qd118118
4楼-- · 2020-01-14 06:06
 精彩回答 2  元偷偷看……
laujc
5楼-- · 2020-01-14 06:15
qd118118 发表于 2018-11-21 10:48
1L

来自C语言规范呀,指明这个1是long型
laoshuhunya
6楼-- · 2020-01-14 09:38
mangolu 发表于 2018-11-21 10:11
哦,谢谢!原来如此。

那么,在keil c51中,未指定类形的,默认是int了? ...

为避免下次再掉坑,建议你用 1uL

一周热门 更多>