您的位置:首页 > 其它

基础, 无聊做做c基础题

2011-01-25 16:09 176 查看
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
本文出自 “人生得意须尽欢” 博客,请务必保留此出处http://no001.blog.51cto.com/1142339/485804
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: