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

来源:互联网 发布:苏州教师网络培训平台 编辑:程序博客网 时间:2024/06/06 03:52

看下面程序:

#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各位取反末位加11000 0001-128的补码为1000 00001000 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=256a[256]= -1这和前面一轮的取值是一样的……

    由于strlen计算长度不算最后的’/0’,因此它计算的长度为a[0]~a[254],255。

原创粉丝点击