原创 【整理】关于uint8_t的问题

2011-10-10 09:42 1503 4 4 分类: 软件与OS
刚刚做到一道例题,是关于编译器将uint8_t其实当成char处理的问题


#include "stdint.h"

volatile uint16_t r1, r2;

int main()
{
  volatile uint8_t c;
  
  r1 = r2 = 0xFFFF;
  c = 0x55;

  r1 &= ~c;

  r2 &= (uint8_t)~c;

}
结果r1为0xFFAA, r2为0x00AA,为什么有这种结果呢? 红字显示的括号里的uint8_t有什么作用?

uint8_t是八位。
0x55是0101 0101
~c是 1010 1010即0xAA
注意第一个表达式,因为uint16_t是16位,根据C的扩展规则(其实就是隐式类型转换规则),c被扩展为16位,再和r1进行位运算:
0xFFFF & 0xFFAA(为什么会扩展为FF?因为最高位为1)
第二个式子,c同样被扩展为0xFFAA,但是这时c被强制类型转换为int8_t,高8位被截掉,最后剩下0xAA这八位,和r2做位运算,结果就是0xAA
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
4
关闭 站长推荐上一条 /3 下一条