下面代码的结果是( )
int main()
{
char a[1000] = {0};
int i=0;
for(i=0; i<1000; i++)
{
a[i] = -1-i;
}
printf("%d",strlen(a));
return 0;
}
A.1000
B.999
C.255
D.256
解答:
a是字符型数组,strlen找的是第一次出现尾零(即值为0)的位置。考虑到a[i]其实是字符型,如果要为0,则需要-1-i的低八位要是全0,也就是问题简化成了“寻找当-1-i的结果第一次出现低八位全部为0的情况时,i的值”(因为字符数组下标为i时第一次出现了尾零,则字符串长度就是i)。只看低八位的话,此时-1相当于255,所以i==255的时候,-1-i(255-255)的低八位全部都是0,也就是当i为255的时候,a[i]第一次为0,所以a[i]的长度就是255了。
故选C。
具体解释:只看低八位的话,此时-1相当于255
char是一个字节,即为8bit 并且存储是以二进制补码的形式进行存储的!!!
-1:(原码:10000000 00000000 00000000 00000001)
(以char 8bit进行存储的原码:00000001) 反码:(11111110) 补码:(11111111)
(要注意一点:此时被截断后的最高位不是代表符号位,故反码时要一起反)
-1-i:-1(补码:11111111) -2(补码:11111110) -3(补码:11111101)...
可知:规律为 每次(-i)都等价于在补码上(-1)
11111111的正数表示为255 每次(-i)得到的数便是在255上减去i
而strlen统计的便是0前面的数的个数,故只要令(255-i)==0就可得知strlen的大小
即i=255,注意i从0开始,所以统计至254时个数依旧是255!