鱼C论坛

 找回密码
 立即注册
查看: 4682|回复: 8

神奇的ASCII,求解释原因

[复制链接]
发表于 2013-2-7 17:12:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 huaidisk 于 2013-2-7 17:14 编辑

今天无意打了几行代码,好奇之下,随便输了几个数,发现了点规律,然后就迷茫了。。。
代码:

#include <stdio.h>
#include <conio.h>
void main()
{
int a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z;
a = 0  ;
b = 1  ;
c = 2  ;
d = 3  ;
e = 4  ;
f = 5  ;
g = 126;
h = 127;
i = 128;
j = 129;
k = 130;
l = 131;
m = 252;
n = 253;
o = 254;
p = 255;
q = 256;
r = 257;
s = 258;
t = 259;
u = 383;
v = 384;
w = 385;
x = 386;
y = 387;
z = 388;
printf("%c , %d\n", a, a);
printf("%c , %d\n", b, b);
printf("%c , %d\n", c, c);
printf("%c , %d\n", d, d);
printf("%c , %d\n", e, e);
printf("%c , %d\n", f, f);
printf("%c , %d\n", g, g);
printf("%c , %d\n", h, h);
printf("%c , %d\n", i, i);
printf("%c , %d\n", j, j);
printf("%c , %d\n", k, k);
printf("%c , %d\n", l, l);
printf("%c , %d\n", m, m);
printf("%c , %d\n", o, o);
printf("%c , %d\n", p, p);
printf("%c , %d\n", q, q);
printf("%c , %d\n", r, r);
printf("%c , %d\n", s, s);
printf("%c , %d\n", t, t);
printf("%c , %d\n", u, u);
printf("%c , %d\n", v, v);
printf("%c , %d\n", w, w);
printf("%c , %d\n", x, x);
printf("%c , %d\n", y, y);
printf("%c , %d\n", z, z);
getch();
}


其中,从0到128都有其对应的ASCII值,当然,其中有许多很奇怪的图案,比如1和2是个很灵异的笑脸 。可能是我的VC6.0++里的ASCII比较旧了吧,只有128个字符 。从129开始,一直到254都没有字符,全为问号。255看起来像是2个空格,很特殊。然后从256开始,又进入了循环,直到第384。从385开始,一直到510,就都是问号了,然后就分别从512,1024......开始进入循环,128个数之后,又是问号了。。。

然后,问题来了:

首先,在ASCII表上看到的1、2、3直到32,以及127和128,都是一些命令之类的东西,为什么到这里就变成了一些很灵异的图案了呢?
其次 ,为什么分别从第256,512,1024......开始就又一次循环了呢?是跟内存有关吗?有什么关系?
最后,那个第255是怎么回事,看上去像是2个空格。第511和1023也是这样。。
补充,如果把int 改为char ,运行,就会发现,第一列与没变之前是一样的,第二列就会出现许多负值,这又是为什么喃。。
求各位大神帮忙解释一下啦。。


微博桌面截图_20130207152749.jpg




小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-2-18 21:12:24 | 显示全部楼层
:L太深奥了
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-2-18 21:37:31 | 显示全部楼层
本帖最后由 cct 于 2013-2-18 21:39 编辑

:handshake因为设定,有些ascii貌似显示不了所以拿其他的代替,所以出现很多奇怪的图案,
然后,我觉得改为char之后因为255+超出范围所以变成负的吧,
再然后,重复出现某些图案可能是因为printf函数内置的%c吧,当用printf将int强制转换为char的时候(尤其是非法值的时候)会进行一定的处理。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-2-19 00:56:20 | 显示全部楼层
前6个知道呵呵
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-2-21 11:55:45 | 显示全部楼层
我也 纠结 过 所以干脆 放弃学汇编了 这才来学C的
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-2-21 12:03:34 | 显示全部楼层
本帖最后由 颓废的青春 于 2013-2-21 15:37 编辑

因为从 256开始 字符 就占 2个字节 也就是 16位, 而printf 输出的是 char(一个字节),所以就把 16位的后半部分打印出来,而 257 的 二进制 是0000 0001 0000 0001,前8位 刚好与 1( 二进制0000 0001 )一样,所以看上去就循环了
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-2-21 13:22:37 | 显示全部楼层
溢出
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-2-21 15:00:40 | 显示全部楼层

明白了,谢谢啦。。
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-8-8 10:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表