谢谢楼上两位的解答。
尤其谢谢Starwings83,这次又来帮忙了:))
你的解释没有错,但是我是在AVR单片机环境下运行的,所以或许和你说的不一样。
基础环境变量:
char 8 bits
int 16 bits
应用头文件stdint.h定义uint8_t
对程序又做了如下的改动,并得出结果。
#include "stdint.h"
volatile uint16_t r1, r2,r3,r4,r5;
int main()
{
volatile uint8_t c;
c = 0x55;
r1 =0xFFFF&c; //r1结果为0x0055,这说明了,c被扩展为了0x0055,如果被扩展为了0xFF55则结果应为0xFF55
r2=~c;//r2结果为0xFFAA
r3=(uint8_t)~c;//r3结果为0x00AA
r4=r5=0xFFFF;
r4 &= ~c;//r4结果为0xFFAA
r5 &= (uint8_t)~c;//r5结果为0x00AA
}
前提说明: 虽然通过头文件stdint.h定义了uint8_t,但是编译器实际上是把它作为"char"来处理的。因为在这里的环境下并没有8位的整型存在,只有8位的字符型。当对定义为uint8_t的变量进行算术或者逻辑操作时,其实是在对char型的变量进行操作。对字符型变量进行计算或者逻辑操作先要把8位的char转成16位的int(即从0x55->0x0055),然后再进行下面的运算。
这里依序解释上面的结果:
c=0x55;
r1 =0xFFFF&c; //r1结果为0x0055
对c进行逻辑与运算,因为c为char型,因此要转成16位int才能进行运算,
c: 0x55->0x0055
r1=0xFFFF&0x0055=0x0055
r2=~c;//r2结果为0xFFAA
c: 0x55->0x0055 r2=~c=0xFFAA
r3=(uint8_t)~c;//r3结果为0x00AA
r3=(uint8_t)r2, 0xFFAA->0xAA->0x00AA,
到这里r4,r5也不用解释了。
我想大概应该是这样,初学者对很多东西还是不懂的。比如一直到现在都不知道volatile是干什么的,比如在这个程序里为什么一定要加volatile呢?
[[it] 本帖最后由 都都 于 2008-8-2 05:55 编辑 [/it]]