看到一个很有意思的题目,
4. (单选)下列程序执行后的输出结果是( )。
int main()
{
signed char x = 0xFFFE;
printf("%d \n", x--);
return 0;
}
A -32767
B FFFE
C -2
D -32768
正确答案是C
考察的是补码与原码,还有C语言的符号变量
signed char 取值范围只有127 ~ -128 ,0xFFFE已经超过,会自动截断,取低八位,也就是0xFE
1111 1110
很重要的一点,计算机使用的都是补码,所以要先转原码
也就是除符号位取反后再加1
1000 0001
1000 0010
也就是十进制的-2
又看到一个有意思的题目
void Test(){
int a = -1;
unsigned b = 10;
if(a>b){
printf("a greater than b ");
}else{
printf("b greater than a ");
}
}
先说结果,输出是a greater than b;
原因:
隐式转换:
占用字节数少的类型向占用字节数多的类型转换
同字节数的情况下,有符号向无符号转换
这种情况就是有符号a 向无符号类型隐式转换,
a在机器里存储是补码存储,先算出:
1000 ....(省略0) 0001
然后算出补码,除符号位取反+1,得
1111 ....(省略1) 1111
也就是在机器里存储是这个样子,然后转成无符号类型,也就是默认正数(我理解是因为没有符号位了),这个时候肯定比10要大