请问在Keil C51的for循环参数里左移最大只能15位吗?
如题,如下面的程序中:void main(void) {
unsigned char ucI;
unsigned long ulTemp = 0x80000000;
Initial_System(); /** 系统初始化 */
for(ucI = 0; ucI < 32; ucI ++) {
if(ulTemp & (1 << ucI)) {
HD44780_Display_Hex(0, 0, ucI / 10); /** 显示ucI的值,十位 */
HD44780_Display_Hex(0, 1, ucI % 10); /** 显示ucI的值,个位 */
}
}
while(1);
}
按照道理,应当1左移31次时和0x80000000相与,if里才为真才对,但是实际运行却是左移15次的时候为真。运行结果如下图:
当ulTemp = 0x00008000及以下时,运行结果是正常的:
当ulTemp = 0x00008000时:
当ulTemp = 0x00000800时:
请问我的程序逻辑有问题吗?还是到底是什么问题?
特意去Keil官网看了,Keil C51确实支持unsigned long类型,并且是4字节阿:
http://www.keil.com/support/man/docs/c51/c51_le_datatypes.htm
你知道1 << ucl是什么数据类型不?请改为1L << ucl。 takashiki 发表于 2018-11-21 06:37
你知道1
哦,谢谢!原来如此。
那么,在keil c51中,未指定类形的,默认是int了? takashiki 发表于 2018-11-21 06:37
你知道1
1L << ucl 学习了,想请教下这写法出自何处? qd118118 发表于 2018-11-21 10:48
1L
来自C语言规范呀,指明这个1是long型 mangolu 发表于 2018-11-21 10:11
哦,谢谢!原来如此。
那么,在keil c51中,未指定类形的,默认是int了? ...
为避免下次再掉坑,建议你用 1uL
本帖最后由 mangolu 于 2018-11-21 11:30 编辑
laoshuhunya 发表于 2018-11-21 11:10
为避免下次再掉坑,建议你用 1uL
已改,谢谢!
HD44780_Display_String(0,0,"\"1\"Size: ");
HD44780_Display_String(1,0,"\"1UL\"Size: ");
HD44780_Display_Hex(0,11,sizeof(1));
HD44780_Display_Hex(1,11,sizeof(1UL));
mangolu 发表于 2018-11-21 11:21
已改,谢谢!
在意存储空间的话可以这样: (unsignedlong)1
laoshuhunya 发表于 2018-11-21 13:23
在意存储空间的话可以这样: (unsignedlong)1
(unsigned long)1 和 1UL有什么区别?强制类型转换是使用过程中才转换,实际存储还是int类型存储? mangolu 发表于 2018-11-21 13:53
(unsigned long)1 和 1UL有什么区别?强制类型转换是使用过程中才转换,实际存储还是int类型存储? ...
是的~
laoshuhunya 发表于 2018-11-21 14:35
是的~
哦,原来如此,谢谢! 哈哈哈,曾经也掉过这个坑! 使用#include<stdint.h>,里面的uint32_t uint8_t,会更加明显 谢谢楼主看了一下贴子 跳出数据处理的坑了之前写的有些理所当然了~~不同芯片 不同编译器还是要注意下细节好点强制一下数据类型比较合规 C99规范:UINT32_C(1) << ucl
页:
[1]