真心C语言 发表于 2013-12-10 11:54:09

ASCII问题

小弟有个问题一直很困扰,有高人指点过,还是不懂。就是下面这个。(为什么要用256-191呢)
int a= -191; printf("%c",a); 输出结果为 A

我的疑问:A 的 ASCLL 码值对应的不是 65 吗

amydog 发表于 2013-12-10 12:43:35

本帖最后由 amydog 于 2013-12-10 12:46 编辑

这个问题我想了好一会你把-191转成二进制看是多少   在对照来看看   可能涉及到补码的知识   
汗都是新手悲催

zhanshen158 发表于 2013-12-10 13:28:22

也许是用%c格式打印,只截取了a的低8位吧

liufei_vip 发表于 2013-12-10 13:42:24

上面两位的加起来差不多就是正确答案
-191在内存中的补码表示为FFFFFF41
输出的时候用%c就只截取低8位,41的10进制就是65。。。

真心C语言 发表于 2013-12-11 17:46:00

amydog 发表于 2013-12-10 12:43 static/image/common/back.gif
这个问题我想了好一会你把-191转成二进制看是多少   在对照来看看   可能涉及到补码的知识   
汗都是新 ...

很多高人都说是补码的问题,可惜自己还是不太懂。
谢谢

amydog 发表于 2013-12-12 12:38:23

真心C语言 发表于 2013-12-11 17:46 static/image/common/back.gif
很多高人都说是补码的问题,可惜自己还是不太懂。
谢谢

这个问题 昨天晚上埋头苦干,算是理解了

个人小心水仅供你参考下:

-191   的补码 根据 郝斌老师的讲解先计算191的二进制是多少(这个应该知道怎么算的吧,191除以2 取余 直到0为止不过便于计算往往是拿十进制 先转换为十六进制 也就是 BF二进制为 10111111

然后所有位取反   0100 0000      末尾+1    最终结果是 0100 0001   这个二进制对应的十进制就是65


额做个补充   计算机int型一般都是占4个字节也就是32位用二进制表示也就是要占32位    32位的首字节0表示是正数 1表示为负数   因为你是拿int类型强制转换为char型char只占1字节,最终只能保持最后的1个字节 即 0100 0001   所以是65 char为A

真心C语言 发表于 2013-12-12 17:13:34

amydog 发表于 2013-12-12 12:38 static/image/common/back.gif
这个问题 昨天晚上埋头苦干,算是理解了

个人小心水仅供你参考下:


你的讲解很详细,我也明白了这个问题。可是看了之后,我又产生了新的问题。如下
int a=10;
printf("%d",a);
我们都知道结果是10.(这里为什么不计算10的补码呢)

amydog 发表于 2013-12-12 21:43:55

真心C语言 发表于 2013-12-12 17:13 static/image/common/back.gif
你的讲解很详细,我也明白了这个问题。可是看了之后,我又产生了新的问题。如下
int a=10;
printf(" ...

呵呵 你钻牛角尖了,原始的问题是 a=-191负数是这样来的正数直接算二进制不就是了
页: [1]
查看完整版本: ASCII问题