让我们以以下两个1字节变量为例:
uint8_t x1 = 0x00;
uint8_t x2 = 0xFF;
打印位补时,结果是一个4字节的变量:
printf("%02X -> %02X; %02X -> %02X\n", x1, ~x1, x2, ~x2);
00 -> FFFFFFFF; FF -> FFFFFF00
我知道这可以通过转换或屏蔽解决:
printf("%02X -> %02X; %02X -> %02X\n", x1, (uint8_t) ~x1, x2, (uint8_t) ~x2);
00 -> FF; FF -> 00
printf("%02X -> %02X; %02X -> %02X\n", x1, ~x1&0xFF, x2, ~x2&0xFF);
00 -> FF; FF -> 00
但是为什么会出现这种非直观的行为呢?
%X
是用于unsigned int
的。而且,uint8_t
不是一个2字节的变量。 - Eugene Sh.