C语言中有符号字符型数据值域的范围是-128到+127,请问那个-128是怎么得来的呀?

就算是全1的话,也是-127呀,那-128怎么来的呀?请求高手解决呀。谢谢啦!... 就算是全1的话,也是-127呀,那-128怎么来的呀?请求高手解决呀。谢谢啦! 展开
 我来答
solidco2
2015-06-08 · 知道合伙人软件行家
solidco2
知道合伙人软件行家
采纳数:126 获赞数:539

向TA提问 私信TA
展开全部
这个你理解错了,-127并不是全1,而全1却是-1。看下面的规律,从上到下都是+1 关系:
0000 0001 1
0000 0010 2
。。。。
0111 1110 126
0111 1111 127 (有符号数最大值)
1000 0000 -128 (比127还大1的值)
1000 0001 -127 (比127还大2的值)
。。。。
1111 1110 -2 (比127还大127的值)
1111 1111 -1 (比127还大128的值)
0000 0000 0 (比127大129)
0000 0001 1 (怎么样,这个数字是完全循环的)

怎么样,看我说0比127大129是胡说八道是吧,看我来计算一下:127+129 = 256,char能表示的总个数是256,256 % 256 == 0。其实补码的方式恰好是最适合计算机里保存和计算的方式,理由如下:
数学上,-127(1000 0001)是大于 -128(1000 0000)的,而这两个二进制的值不管用在有符号还是无符号、4位还是8位还是16位(前补零),看上去都是-127>-128。
加法运算的时候,完全不需要考虑符号,例如,-1 + 2 = (1111 1111) + (0000 0010),从右数第二位开始进位,结果是 (1 0000 0001) 而char的位数是8位,于是最左位直接舍去不管了,结果就是 0000 0001 ,-1 + 2 = 1,结果正确。至于 127 + 1 = -128这种事情,就是计算机整形运算的溢出了,很容易理解,而且有时候也很好用。

以上用法叫做补码,而你所说的-127用全1表示的方式也有,叫做反码,负数和其绝对值只有第一位符号位的区别。
0111 1110 126
0111 1111 127
1111 1111 -127
1111 1110 -126

这样看来,虽然对人来说阅读和理解都简单,但是有下面的几个问题:
-126减去-127应该等于1,而这两个数字的码值看上去是 1111 1111 > 1111 1110 的,升位操作(前补零)也是一样的结果;
0000 0000 和 1000 0000 分别表示 +0 和 -0,而这两个值应该是一样的。
负数和正数进行加法运算的时候,需要把负数去符号变成绝对值,然后再变成减法再进行计算,复杂度要大多了。

---------------------------
我不是为了挖坟才来挖坟的,因为我今天看mysql的tiny int的分析的时候,有个人发文说-127 就是全1,而且还不让评论,这太坑爹了啊,而且搜了一下,对补码一知半解的人不在少数,所以借楼主的位置来此说下
xxpxxxxp
2010-03-23 · TA获得超过836个赞
知道小有建树答主
回答量:277
采纳率:0%
帮助的人:382万
展开全部
char型占用一字节,8比特,可以表示2的8此方,即256个数字,值域由-128到+127。其中,1000000表示-128
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
STXH0001
2010-03-23 · TA获得超过541个赞
知道答主
回答量:127
采纳率:0%
帮助的人:0
展开全部
这是个码制的问题,计算机中采用补码表示数据,具体你可以搜索“补码”两个字得到答案
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式