您的位置:首页 > 其它

关于字符的一道很容易做错的题目

2010-09-04 17:41 253 查看
看下面程序:
#include<stdio.h>
int main()
{
char a[1000];
int i,j;
for(i=0;i<1000;i++)
a[i]=-1-i;
printf("%d/n",strlen(a));
return 0;
}
请问上述程序的输出结果是什么?答案是255。
解答该题需要注意以下几点:
1、 数据在机器中是如何存取的?数据在机器中是以补码形式存放的。正数的补码和其原码一致,负数的补码符号位为1,其余位为该数绝对值的原码各位取反然后末位加1。
2、 两个用补码表示的数,如果最高位(符号位)有进位则进位被舍弃。
3、 -1的补码为1111 1111(及0xff),-127的补码为(0111 1111各位取反末位加1得1000 0001)-128的补码为1000 0000(1000 0000各位取反末位加1得到)
4、 char型的取值范围:[-128,127],当数值超过该范围时会发生溢出,变量的值只能从8位存取空间中取。
5、 strlen函数是计算字符串的长度的,并不包含字符串最后面的’/0’,而判断一个字符串是否结束的标志就是看其是否遇到’/0’,如果遇到’/0’,则认为本字符串结束。
明白了上述几点,上述程序题则不难了。a[0]=-1,a[1]=-2……a[127]=-128,然后当i=128时内存中的二进制比特将发生溢出而取得低8位值,a[128]=127,a[129]=126,……a[254]=1,a[255]=0,然后i=256,a[256]= -1这和前面一轮的取值是一样的……
由于strlen计算长度不算最后的’/0’,因此它计算的长度为a[0]~a[254],为255。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: