关于unsiged char 的一个面试题
2010-11-24 22:11
381 查看
刚才在孙晓亮的博客上看到一道C语言面试题,说是一个小问题,但我在看完标题之后都感觉出来他要考察变量类型表示越界问题了,因为以前在电脑鼠的算法程序中有过类似的问题,当时姚司还问过,但当时没想出来,后来才恍然大悟的。下面把这道题贴出来大家一块看看吧。首先声明一下:写这个不是为了装B,本人C语言功底不好,写出来只为大家共同分享,已经看过的人就不需要再看了。
#include <stdio.h>
#define MAX 255
int main()
{
unsigned char a[256],i;
for(i=0;i<=MAX;i++)
a[i]=i;
for(i=0;i<=MAX;i++)
printf("%d ",a[i]);
}
大家看看有什么错误?这个问题错误比较隐蔽,不仔细一点是看不出来的。
可能有的人已经看出来了,我来给大家解释一下吧,错误在于unsigned char 这个数据类型,它占了一个字节(8位),表示的数据范围是0~255(00000000~11111111,八位);当i=255; i++ ;因为 i本身是unsigned char类型,占8位,所以此时i+1变成了100000000 9位,又因为i只能占8位,所以舍掉了最高位,此时的i值又变成00000000了,即就是0;也就是这时i的值变为0了,然后就从i=0开始重新开始循环,最后一直循环下去成了死循环了。
不信大家可以去做一下这个实验,运行一下下面这个程序:
#include <stdio.h>
int main()
{
unsigned char i=0;
printf("/n%d /n",--i);
i=255;
printf("/n%d /n",++i);
}
这个例子就充分说明了越界问题。通俗地讲越界会使变量的值会“从一个极端走向另外一个极端”。
总是一句话:基础很重要,我们得打好基础。
#include <stdio.h>
#define MAX 255
int main()
{
unsigned char a[256],i;
for(i=0;i<=MAX;i++)
a[i]=i;
for(i=0;i<=MAX;i++)
printf("%d ",a[i]);
}
大家看看有什么错误?这个问题错误比较隐蔽,不仔细一点是看不出来的。
可能有的人已经看出来了,我来给大家解释一下吧,错误在于unsigned char 这个数据类型,它占了一个字节(8位),表示的数据范围是0~255(00000000~11111111,八位);当i=255; i++ ;因为 i本身是unsigned char类型,占8位,所以此时i+1变成了100000000 9位,又因为i只能占8位,所以舍掉了最高位,此时的i值又变成00000000了,即就是0;也就是这时i的值变为0了,然后就从i=0开始重新开始循环,最后一直循环下去成了死循环了。
不信大家可以去做一下这个实验,运行一下下面这个程序:
#include <stdio.h>
int main()
{
unsigned char i=0;
printf("/n%d /n",--i);
i=255;
printf("/n%d /n",++i);
}
这个例子就充分说明了越界问题。通俗地讲越界会使变量的值会“从一个极端走向另外一个极端”。
总是一句话:基础很重要,我们得打好基础。
相关文章推荐
- 关于dubbo的一个面试题
- 关于enum ,调用webservice,用户控件与主页面之间的交互,datsource属性,net面试题,反射类生成sql语句,URl重写一个小实例
- 一个关于字符串拷贝的面试题
- 关于测试一个接口的面试题
- 关于《一个fork的面试题》
- 一个关于布尔值的面试题
- 关于阶乘的两个常见算法及一个相关面试题
- 关于int,String,char的一道面试题
- 关于int fun(char *)的一个注释
- 关于阶乘的两个常见算法及一个相关面试题
- 今天在看一些面试题的时候遇到的一个关于strcmp()返回值的细节问题
- 这是某公司的一个面试题,关于求平均数的java程序,
- 关于类构造的一个面试题
- 一个关于截取字符串的面试题!
- 一个关于算法的面试题,来源于网络
- [VC] 一个微软面试题--关于位结构体
- 一个关于finally和return的面试题
- 一个关于malloc的面试题
- 关于vector容器的一个面试题
- 一个关于线程的经典面试题,要求用三个线程,按顺序打印1,2,3,4,5.... 71,72,73,74, 75. 线程1先打印1,2,3,4,5, * 然后是线程2打印6,7,8,9,10, 然后是