关于字符的一道很容易做错的题目
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。
#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。
相关文章推荐
- 求解:关于fork的一道题目
- 一道关于javascript数据类型题目的思考
- 关于动态批处理的一道题目
- 关于设计模式的一道题目
- 一道关于加载顺序的题目分析
- 关于新手用java写题目,遇到的字符和字符串问题
- TAOCP3中一道关于对序列重排的题目的实现
- 一道关于java线程中断的题目,求大神指导,昨晚的阿里巴巴笔试题
- 关于指针加减的一道题目
- 分享一道笔试题目--关于static和extern变量的问题
- 20080306:上海华为的一道关于指针的编程题目
- 一道关于继承和多态的题目
- 一道关于jvm加载的简单题目
- 关于short的一道简单题目
- 关于一道JS题目
- 一个关于字符串匹配的算法题目
- 使用缓冲流读取试题文件,每次显示试题文件中的一道题目。读取到字符“*”时候暂停读取,等待用户从键盘输入答案。用户做完全部题目后,程序给出用户的得分。Test.txt如下:
- 一道关于位数扩充的题目
- 关于C++临时对象的一道题目
- 一道经典的C++题,关于分钱的问题,适合新手阅读(黑客X档案论坛题目) [c#]