int main()

{

char a[1000];

int i;

for(i=0;i<1000;i++)

{

a[i]=-1-i;

}

printf("%d",strlen(a));

return 0;

}

此题貌似很简单,那么你说,答案是多少呢?

首先看strlen函数计算数组长度,当判断出有'\0'即0x00时,得出长度(不包括0x00)。

那么a【?】是0x00呢?

a数组是一个char有符号的类型。 按整数范围来看,-1-i取值范围是[-1, -1000]

因为有符号char类型的范围是【-128,127】,所以当a【i】小于-128,就发生了溢出。

显然-128之前不会==0x00, 那么我们看-1-128, 显然它=-129.

那么char类型的-129是多少呢? 这里涉及到补码问题,补码最简单的说就是按位取反+1。

我们算一下:129==1000 0001;   取反==0111 1110;  +1 ==0111 1111

我们知道负数首位为-1,但这里-129溢出,所以这里首位不为-1,(其实-1,应该在第9位,

这里只有8位,进位自然被舍弃了)

依次进行,当i=255时, -256==0x00

这里就是strlen判断的地方,所以最终答案是255