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;

posted @ 2018-08-12 21:16  2018年8月10日注册  阅读(155)  评论(0编辑  收藏  举报