- #include <stdio.h>
- int main(void){
- unsigned char a = 0xa5;
- printf("%d\n",~a);
- char b = ~a;
- printf("%d\n",b);
- unsigned char c = ~a;
- printf("%d\n",c);
- return 0;
- }
表面上看这3个打印结果应够都一样,但是编译后结果却是:-166 90 90 。 请问-166是怎么来的?
0xa5对应的十进制为165,它的反码为-166.
第一次输出是以十进制输出a的反码,即为-166.
第二次将a的反码先存到字符型变量b中,char能表示-128~127,而~a为-166,所以b=-166+256,b为90,输出90。
同理,第三次将a的反码先存到无符号字符型变量c中,unsigned char能表示0~255,而~a为-166,所以c=-166+256,c为90,输出90。
第一次之所以与后两次不同是因为~a并没有先存入其他变量,而是直接输出,其值并没有在赋值时发生改变。