搜索
bottom↓
回复: 15

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

[复制链接]

出0入0汤圆

发表于 2018-11-21 01:12:41 | 显示全部楼层 |阅读模式
如题,如下面的程序中:

  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次的时候为真。运行结果如下图:



当ulTemp = 0x00008000及以下时,运行结果是正常的:

当ulTemp = 0x00008000时:


当ulTemp = 0x00000800时:


请问我的程序逻辑有问题吗?还是到底是什么问题?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2018-11-21 01:17:41 | 显示全部楼层
特意去Keil官网看了,Keil C51确实支持unsigned long类型,并且是4字节阿:

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入93汤圆

发表于 2018-11-21 06:37:03 来自手机 | 显示全部楼层
你知道1 << ucl是什么数据类型不?请改为1L << ucl。

出0入0汤圆

 楼主| 发表于 2018-11-21 10:11:51 | 显示全部楼层

哦,谢谢!原来如此。

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

出0入21汤圆

发表于 2018-11-21 10:48:50 | 显示全部楼层

1L << ucl   学习了,想请教下这写法出自何处?

出0入4汤圆

发表于 2018-11-21 10:54:33 | 显示全部楼层

来自C语言规范呀,指明这个1是long型

出0入0汤圆

发表于 2018-11-21 11:10:12 | 显示全部楼层
mangolu 发表于 2018-11-21 10:11
哦,谢谢!原来如此。

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

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

出0入0汤圆

 楼主| 发表于 2018-11-21 11:21:32 | 显示全部楼层
本帖最后由 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));
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-11-21 13:23:05 | 显示全部楼层

在意存储空间的话可以这样: (unsigned  long)1

出0入0汤圆

 楼主| 发表于 2018-11-21 13:53:47 | 显示全部楼层
laoshuhunya 发表于 2018-11-21 13:23
在意存储空间的话可以这样: (unsigned  long)1

(unsigned long)1 和 1UL有什么区别?强制类型转换是使用过程中才转换,实际存储还是int类型存储?

出0入0汤圆

发表于 2018-11-21 14:35:28 | 显示全部楼层
mangolu 发表于 2018-11-21 13:53
(unsigned long)1 和 1UL有什么区别?强制类型转换是使用过程中才转换,实际存储还是int类型存储? ...

是的~                          

出0入0汤圆

 楼主| 发表于 2018-11-21 14:38:35 | 显示全部楼层

哦,原来如此,谢谢!

出20入70汤圆

发表于 2018-11-21 15:01:01 | 显示全部楼层
哈哈哈,曾经也掉过这个坑!

出0入0汤圆

发表于 2018-11-22 08:19:40 来自手机 | 显示全部楼层
使用#include<stdint.h>,里面的uint32_t uint8_t,会更加明显

出0入8汤圆

发表于 2019-4-18 14:15:04 | 显示全部楼层
谢谢楼主看了一下贴子 跳出数据处理的坑了  之前写的有些理所当然了~~不同芯片 不同编译器还是要注意下细节好点  强制一下数据类型比较合规

出0入0汤圆

发表于 2019-4-18 14:21:59 来自手机 | 显示全部楼层
C99规范:UINT32_C(1) << ucl
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 17:56

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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