第一题:
#includeint main() { char a = -1; signed char b = -1; unsigned char c = -1; printf("a=%d,b=%d,c=%d", a, b, c); return 0; }
解题思路:a和b都是有符号数,c是无符号数。-1以二进制补码序列存进去,-1的补码是全1,因为char类型占一个字节即八个比特位,所以-1以11111111二进制序列存进去。因为以%d的形式打印,所以存在整型提升,(a和b是一样的,所以这里只讨论a)a是一个有符号数,所以整型提升的时候符号位是1,给a补上二十四个1,取出来的时候符号位为1即a是一个负数,所以要把补码转成原码,所以a和b的结果就是-1。c是一个无符号数,所以整型提升的时候看自身类型给c补上二十四个0,以%d的形式解释c,c的符号位为0即c为一个正数,所以它的原码 反码 补码都是一样的,所以c的结果为255。
第二题:
#includeint main() { char a = -128; //1000 0000 printf("%un", a); return 0; }
解题思路:-128以1000 0000的形式存进去,因为以%u的形式打印,所以存在整型提升,符号位为1,所以补上二十四个1。取的时候因为无符号数不看符号位,不需要将补码转成原码,所以结果就为一个很大的数。
第三题:
#includeint main() { char a = 128; printf("%un", a); return 0; }
解题思路:和第二题思路一致。
第四题:
#includeint main() { char a = 128; printf("%dn", a); return 0; }
解题思路:存的时候128以1000 0000的形式存进去,因为以%d的形式打印,所以存在整型提升,a自身的类型是有符号数,所以给a补上二十四个1。以%d的形式解释,符号位为1即a是一个负数,所以要将补码转成原码,结果就为-128。
第五题:
#includeint main() { int i = -20; unsigned int j = 10; printf("%dn", i + j); return 0; }
解题思路:按照补码的形式进行运算,最后格式化成为有符号整数。-20的补码是1111……11101100,10的补码就是原码即0000……00001010,相加结果为1111……11110110,因为以%d的形式解释,符号位是1即结果是一个负数,所以要将补码转成原码,最后结果为1000……00001010即-10。
第六题:
#includeint main() { unsigned int i; for (i = 9; i >= 0; i--) { printf("%un", i); } return 0; }
解题思路:因为i是无符号数,所以i一定大于0,程序会出现死循环,这个死循环的特征是从9减到0,再从0变为无符号整型的最大值,然后再从最大值减到0,0又变成最大值,一直循环下去。
第七题:
#includeunsigned char i = 0; int main() { for (i = 0; i <= 255; i++) { printf("hello worldn"); } return 0; }
解题思路:因为i是无符号数,i从0加到255,255加1等于256即1 0000 0000,所以会发生溢出,截断后又变成0,所以程序结果为死循环,死循环特征为从0到255,然后又从0到255,一直循环下去。
第八题:
#includeint main() { char a[1000]; int i; for (i = 0; i < 1000; i++) { a[i] = -1 - i; } printf("%dn", strlen(a)); return 0; }
解题思路:char类型的取值范围为[-128,127],-1-i可以看成-1+(-i),即-1的补码与-i的补码相加,-1补码为1111 1111。
①0的补码就为0,所以-1+0=(-1),a[0]=(-1);
②-1的补码是1111 1111,所以-1+(-1)=(-2),a[1]=(-2);
③-2的补码是1111 1110,所以-1+(-2)=(-3),a[2]=(-3);
……
-127的补码是1000 0001,所以-1+(-127)=(-128),a[127]=(-128);
-128的补码为1000 0000,所以-1+(-128)=127,a[128]=127;
-129的补码为1 0111 1111,所以-1+(-129)=126,a[129]=126;
最后当a[i]=0时,strlen检测到0时,就结束循环,所以从-1到-128一共有128个数,从127到1一共有127个数,所以一共有255个数,最后结果就为255。



