| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 563 人关注过本帖
标题:求助~~~关于 char
只看楼主 加入收藏
rupei110
Rank: 1
等 级:新手上路
帖 子:26
专家分:3
注 册:2010-11-15
结帖率:50%
收藏
已结贴  问题点数:10 回复次数:5 
求助~~~关于 char
char a;
a = 128;
printf(“%d”,a);
打印出来的值为什么是-128?
2011-06-25 01:06
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:1 
因为 char 取值范围是 -128 ~ 127
2011-06-25 01:35
rupei110
Rank: 1
等 级:新手上路
帖 子:26
专家分:3
注 册:2010-11-15
收藏
得分:0 
回复 2楼 voidx
但是为什么
a = 129时显示的是-127,
a = 255时显示的是-1?
255的二进制代码是 11111111
第一位为符号位 应该是-127啊?
2011-06-25 01:39
a9580643
Rank: 2
来 自:江西九江
等 级:论坛游民
帖 子:60
专家分:59
注 册:2011-4-21
收藏
得分:1 
由于字符型变量一开始的时候只有127个,所以只用到7位存放char变量127的2进制是7个一。
后来才发展为255个,就用上了8位,用最开始的一位存放正负号。

花有重开日,人无在少年。
2011-06-25 03:13
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:8 
回复 3楼 rupei110
恩,你分析的很不错,那么我们一起来看看:
如果符号位为1代表负数,为0代表正数,那么取值范围就是 127 ~ -127,这样的话0就有两种表示方法,0x80(10000000),和0x00(00000000),
但是在目前为了更多的利用这个字节,计算机采用的是补码,什么是补码呢?是这样的:
只要符号位为1,也就是说这个数代表负数,那么把这个数,先取反,再加1后,得到一个新的负数,如11111111,取反后得到00000000,加1后得到00000001,那么这个数就是-1,想一想,这样编码0就只有一种表示方法,0x00(00000000),而0x80(10000000)呢,在上面它也代表0,而现在:取反得01111111,加1得10000000,它就代表-128,-127是什么呢?就是0x81(10000001),-126就是0x82(10000010),一直到-1,0xFF(11111111),再减1,就变成了0,0x00(00000000),再加1就是1,0x01(00000001),一直到127,0x7F(01111111),这就是一些书上说的,它就像一个汽车的里程表一样,会倒回去,呵呵。

这样做是对的,如果是1字节无符号数,unsigned char,那么它可以表示0 ~ 255,可以表示256种状态,用补码的方法来表示也是256种状态,0 ~ 127,-128 ~ -1,只要LZ记住,在C里,一个有符号整数已经达到它可以表示的最大正整数,如果在此基础上加1,那么它就会变成最小的负数,而最小的负数加-1,就变成了最大的正整数。这就是它回倒的过程。


[ 本帖最后由 lz1091914999 于 2011-6-25 09:25 编辑 ]

My life is brilliant
2011-06-25 09:11
rupei110
Rank: 1
等 级:新手上路
帖 子:26
专家分:3
注 册:2010-11-15
收藏
得分:0 
回复 5楼 lz1091914999
哦!!!! Thank you!郁闷了好半天
2011-06-25 20:06
快速回复:求助~~~关于 char
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026558 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved