求下面代码打印结果:
#include<stdio.h>
#include<string.h>
int main()
{
char a[1000] = { 0 };
int i = 0;
for (i = 0; i < 1000; i++)
{
a[i] = -1 - i;
printf("%d\n", a[i]);
}
printf("%d", strlen(a));
return 0;
}
分析:
(1)当 i = 0~127时,a[i]为:
-1-0,-1-1,-1-2,····,-1-127
即-1,-2 ,-3 ,····,-128
(2)当 i = 128时:
-1-128=-1 +(-128)
计算-1+(-128)
10000000 00000000 00000000 00000001 -1原码
11111111 11111111 11111111 11111110 -1反码
11111111 11111111 11111111 11111111 -1补码
10000000 00000000 00000000 10000000 -128原码
11111111 11111111 11111111 01111111 -128反码
11111111 11111111 11111111 10000000 -128补码
11111111 11111111 11111111 11111111 -1补码
11111111 11111111 11111111 10000000 -128补码
11111111 11111111 11111111 01111111 和
char类型截断
01111111 - 127
当 i = 129时:
-1-129=-1 +(-129)
计算-1+(-129)
10000000 00000000 00000000 10000001 -129原码
11111111 11111111 11111111 01111110 -129反码
11111111 11111111 11111111 01111111 -129补码
11111111 11111111 11111111 11111111 -1补码
11111111 11111111 11111111 01111111 -129补码
11111111 11111111 11111111 01111110 和
char类型截断
01111110 - 126
因此,当i>=128时,a[i]为127,126,····,1,0
arr的元素为-1,-2 ,-3 ,····,-128,127,126,····,1,0,-1,-2 ,-3 ,····,-128,127,126,····,0,·····
strlen求的是\0之前的字符个数,即第一个0之前的元素个数=255