刚刚做到一道例题,是关于编译器将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
文章评论(0条评论)
登录后参与讨论