|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2012-11-7 14:27:56
|
显示全部楼层
liwei_jlu 发表于 2012-11-7 13:19 ![](static/image/common/back.gif)
标准c语言里常量默认是32位 int类型
0xff貌似默认等同于 int 0x000000FF
if( x == 0xff) 要先把x转化成int ...
将0xff强制转换成(signed char),再去比较的确是可以的,我在单纯在看C的时候觉得这个理所当然是一个错误,如果结合汇编去看,C51编译器会根据我定的常量编译出不同的结果。比如二楼的程序,如果在- #include "reg51.h"
- volatile signed char x;
- void main()
- {
- x = 128;//128在内存中就是按着0x80储存的
- if( x == [color=Red]128[/color])//该等式不成立
- {
- x = 128;
- }
- if( x == -128 )//该等式成立
- {
- x = 0;
- }
-
- while(1);
- }
复制代码 编译的结果是
24: void main()
25: {
26: x = 128;//128在内存中就是按着0x80储存的
C:0x0003 750880 MOV x(0x08),#P0(0x80)
27: if( x == 128)//该等式不成立
C:0x0006 AF08 MOV R7,x(0x08)
C:0x0008 EF MOV A,R7
C:0x0009 33 RLC A
C:0x000A 95E0 SUBB A,ACC(0xE0)
C:0x000C FE MOV R6,A
C:0x000D EF MOV A,R7
C:0x000E 6480 XRL A,#P0(0x80)
C:0x0010 4E ORL A,R6
C:0x0011 7003 JNZ C:0016- #include "reg51.h"
- volatile signed char x;
- void main()
- {
- x = 128;//128在内存中就是按着0x80储存的
- if( x == [color=Blue]127[/color])//该等式不成立
- {
- x = 128;
- }
- if( x == -128 )//该等式成立
- {
- x = 0;
- }
-
- while(1);
- }
复制代码 编译的结果是
24: void main()
25: {
26: x = 128;//128在内存中就是按着0x80储存的
C:0x0003 750880 MOV x(0x08),#P0(0x80)
27: if( x == 127)//该等式不成立
C:0x0006 E508 MOV A,x(0x08)
C:0x0008 B47F03 CJNE A,#0x7F,C:000E
28: {
这个我似懂非懂..琢磨不透
|
|