mangolu 发表于 2018-11-21 01:12:41

请问在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时:


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

mangolu 发表于 2018-11-21 01:17:41

特意去Keil官网看了,Keil C51确实支持unsigned long类型,并且是4字节阿:

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

takashiki 发表于 2018-11-21 06:37:03

你知道1 << ucl是什么数据类型不?请改为1L << ucl。

mangolu 发表于 2018-11-21 10:11:51

takashiki 发表于 2018-11-21 06:37
你知道1

哦,谢谢!原来如此。

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

qd118118 发表于 2018-11-21 10:48:50

takashiki 发表于 2018-11-21 06:37
你知道1

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

laujc 发表于 2018-11-21 10:54:33

qd118118 发表于 2018-11-21 10:48
1L

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

laoshuhunya 发表于 2018-11-21 11:10:12

mangolu 发表于 2018-11-21 10:11
哦,谢谢!原来如此。

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

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

mangolu 发表于 2018-11-21 11:21:32

本帖最后由 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));

laoshuhunya 发表于 2018-11-21 13:23:05

mangolu 发表于 2018-11-21 11:21
已改,谢谢!

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

mangolu 发表于 2018-11-21 13:53:47

laoshuhunya 发表于 2018-11-21 13:23
在意存储空间的话可以这样: (unsignedlong)1

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

laoshuhunya 发表于 2018-11-21 14:35:28

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

是的~                        

mangolu 发表于 2018-11-21 14:38:35

laoshuhunya 发表于 2018-11-21 14:35
是的~

哦,原来如此,谢谢!

techbaby 发表于 2018-11-21 15:01:01

哈哈哈,曾经也掉过这个坑!

just_lou 发表于 2018-11-22 08:19:40

使用#include<stdint.h>,里面的uint32_t uint8_t,会更加明显

haiyu 发表于 2019-4-18 14:15:04

谢谢楼主看了一下贴子 跳出数据处理的坑了之前写的有些理所当然了~~不同芯片 不同编译器还是要注意下细节好点强制一下数据类型比较合规

at90s 发表于 2019-4-18 14:21:59

C99规范:UINT32_C(1) << ucl
页: [1]
查看完整版本: 请问在Keil C51的for循环参数里左移最大只能15位吗?