1 关于补码与类型转换知识的题,以下程序输出什么?
1 #include <stdio.h> 2 #include <string.h> 3 int main() 4 { 5 char a[1000]; 6 int i; 7 for(i = 0; i< 1000;i++) 8 { 9 a[i] = -1 - i; 10 } 11 printf("%d\n",strlen(a)); 12 return 0; 13 }
第一步先做变形处理: a[i] = -1 - i; -> a[i] = -1 +(-i);
第二步再确定分析目标,
-1 1111 1111
+ (-i) ?
截断溢出低八位= 0000 0000
确定 -i低8位为0000 0001时,与-1相加后,截断后的低八位结果为0
第三步然后分析 -i 数值 的低 char8位二进制的走向。
首先知道i的走向 i 0 1 2 3 4 5 6 ....
那么可以确定(-i)的走向 -i 0 -1 -2 -3 -4 -5 -6
再确定低八位的走向 见下图走向,确定在i==255时到达0000 0001 ,0-255 也就是a[]数组第256个元素值==0
i | -i | -i截断后的低八位 |
0 | 0 | 0000 0000 |
1 | -1 | 1111 1111 |
2 | -2 | 1111 1110 |
3 | -3 | 1111 1101 |
... | ... | ... |
127 | -127 | 0111 1111 |
128 | -128 | 1000 0000 |
129 | -129 ->127 | 0111 1111 |
130 | -130 ->126 |
0111 1110 |
131 | -131 ->125 | 0111 1101 |
... | ||
254 | -254 -> 2 | 0000 0010 |
255 | -255 -> 1 |
0000 0001 到达 |
所以。strlen(a) ==255;