关于数组对应ASCII码越界问题

0x1

首先拿到这个程序我第一反应是,这一定是一个新手的代码,怎么连数据类型都搞不清楚,int和char都没分清楚,无可救药了。但是,下面就打脸了…
在这里插入图片描述

注释

看到了注释里面的内容,不由得思考了起来,认真打量一番发现有点搞头,就认真了起来。

尝试

我刚感觉这是ascii字符的扩展,但是查了查ascii字符最多也就扩展到了255,怎么都说不通的呀。然后就打开了度娘,在上面搜索,访问超过ascii字符边界的问题,终于在一篇百度知道里面看到了一个解答,他是这样描述的,可以把ascii字符看成一个环,如果超过了127就会从头开始。我一想有道理,就对照着ascii码表实验,发现a和b都成了以上结论,但是唯独c不成立,不论我怎么给c增加数值,c依旧输出?

下面附上一张我调试过程的截图,提前声明一下,刚才我在百度搜索到是错误的,正确的原因会在,下面讲出,所以错误的东西就不放太多了,一张就足够了
在这里插入图片描述
可以看到a,b都有变化,唯独c没有

请教

遇到这周问题还是要问大佬们的,所谓的大佬就是那些平常不口嗨,但是做事很稳的人,平时一直口嗨的人,再厉害也是辣鸡。

经过他们一番指点我理解了其中的问题所在:(结合我的想法一起说出来吧)

源头

ascii的出现就是为了解决,计算机中二进制数表示的问题。在计算机储存是用二进制数表示,二聚体用哪些二进制数字表示哪个符号,大家为了相互通信不造成混乱,就规定了一套标准的编码,就是二进制数,统一规定了哪些常用的符号用二进制数来表示

联系

一个二进制数对应一个字符,在127范围内是完全符合的,但是一旦超出之后,就不一样了。
在这里插入图片描述

378 = 0001 0111 1010char只有一字节, 只能显示8位, 所以0001抛弃,剩下0111 1010

结果明显出来了高位舍去,低位正常运作,输出对应的ascii

你以为这样就完了吗?其实还有一点就是c

在我的实验中,发现c为1150及1150之前一段都可以有字符输出,但是,一旦超过1150之后的那一段有一大段空间不论是什么都只输出?

不求甚解

可以观察ascii码表,他们的最高位都是0,但是我们定义的数的大小,有的等于8位(都是说的二进制数超过8位),有的甚至超过8位

对应等于8位的那些我们都只能输出?,对于超过8位的数,有的也会输出?

通过上面高位舍去,低位继续使用,可以发现,当被使用的低8位还是在ascii范围内就可以输出对应的字符。而ascii码的最高位都是0,所以对于那些低8位最高位为1的数字们,都输不出字符,只输出“?”。

那么问题又来了,为啥要输出"?"。因为“?”就是表示没有这个ascii码的显示图像,是控制字符。

有心人

如果你是个有心人你还会发现对于1151这个数,程序对它不对做输出
在这里插入图片描述
这是为什么?

请仔细看ascii码表
在这里插入图片描述
完.

发布了17 篇原创文章 · 获赞 1 · 访问量 466

猜你喜欢

转载自blog.csdn.net/qq_43430261/article/details/102944040
今日推荐