免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3688 | 回复: 12
打印 上一主题 下一主题

[C] 这个看似简单的问题,我没懂,请教下! [复制链接]

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:57:09C
日期:2016-10-25 16:17:59
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-25 23:14 |只看该作者 |倒序浏览
char a;
一个8bit位的有符号数据的范围 是 -128 ~ 127
网上搜罗了大量数据,没有一个解释清楚的,只是提到是这么计算的: -2^7 ~ 2^7-1

问题:为什么正数的边界需要减1,而负数却不需要???

论坛徽章:
0
2 [报告]
发表于 2012-09-25 23:32 |只看该作者
原码和反码中,0分别抢了正数半边一个坑和负数半边一个坑,0占两个坑,所以是对称的。
补码中,0抢了正数那半边的一个坑,负数那半边没动,所以是不对称的。

论坛徽章:
0
3 [报告]
发表于 2012-09-25 23:33 |只看该作者
本帖最后由 sonicling 于 2012-09-25 23:34 编辑

你也可以认为负数把原本给0留的第二个坑(与+0对称的坑)给抢了,所以负数那半边比正数多一个坑。

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
4 [报告]
发表于 2012-09-25 23:35 |只看该作者
8个bits,每个bit可以是0可以是1,所以一共有2^8个组合,也就是说 char 可以表示 2^8个不同的数
用00000000来表示零(这样设计很正常吧),那么将其加一得00000001,也就是用它来表示+1
将其减一得11111111,也就是用它来表示-1
然后+128,也就是10000000
    -128,也就是10000000,两者数值相撞了
此时,如果你是设计者,你会将 10000000 看作是 +128,还是看作是 -128?
如果我是设计者,我会将 10000000 看作是 -128,因为判断数值正负时只需要看最高一位,也就是最高一位可以看作是符号位

不管你这个整型有几位,假设是N位,则它可以表示2^N个不同的数,2^N是个偶数,去掉一个非正非负的零,余下数目是个奇数,不可能平分给正数和负数。

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
5 [报告]
发表于 2012-09-25 23:38 |只看该作者
挖坑....

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
6 [报告]
发表于 2012-09-25 23:45 |只看该作者
shaohui973 发表于 2012-09-25 23:14
char a;
一个8bit位的有符号数据的范围 是 -128 ~ 127

“一个8bit位的有符号数据的范围 是 -128 ~ 127”是对的,但char未必是有符号类型。
1。char可能是有符号类型,也可能是无符号类型
2。signed char、unsigned char 和 char 是三种不同的类型

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:57:09C
日期:2016-10-25 16:17:59
7 [报告]
发表于 2012-09-26 00:36 |只看该作者
以下是我刚找的:

求给定数值的补码表示分以下两种情况:
1.正数的补码:即为其原码。
2.负数的补码:取其绝对值的原码按位取反再加1,即是此负数的补码
给定补码,求补码所表示的(十进制)数值:
1:如果给定的补码形式,是以0开头,则说明此补码表示的是一个正数,直接把此二进制换算成10进制就行。
2:如果给定的补码形式,是以1开头,则说明此补码表示的是一个负数;只需要对此补码按未取反,再对其加1,然后把得到的二进制换算成10进制,得到的就是此补码表示的数值的绝对值,加上负号,就是表示的数值。

【问题一】 -5 -1 在计算机中的实现?(为方便叙述,设数据仅为1个字节)
第一步:首先计算对应十进制数的在计算机中的补码:
       -5:1000 0101(原码) ----1111 1010(反码) --1111 1011(补码)
       -1:1000 0001(原码)-----1111 1110(反码)---1111 1111(补码)
所以 -5 在内存中的形式是 1111 1011;
     -1 在内存中的形式是 1111 1111;
相加运算:
                   1111 1011
            +      1111 1111
                    1111 1010          (溢出一位,丢弃)
计算出来的结果为 1111 1010,这个也是一个补码,那他代表的十进制数是怎么计算?
补码对应的十进制数:补码最高位为0,表示正数;补码最高位为1表示负数
   确定了符号后,需要确定其绝对值:补码按位取反后加1,也就是原码的绝对值。
所以 -5 – 1的计算结果(补码) 1111 1010对应的十进制数绝对值为:0000 0110,即绝对值为6,最后加上符号,得结果为-6
所以,计算机计算 -5 -1 的结果为 -6

【问题二】为什么8位的有符号数据的范围是-128 ~ 127 ?
给定一个8bit的存储空间(存储空间中的数据均被视为补码),
它所能表示的最大正数是0111 1111(补码),也就是说8位的空间中存放最大的整数在内存中的形式为 0111 1111(补码形式)
0111 1111该补码表示是正数,对应的十进制数为127.
如果该8位内存要存放负数,则最大的负数(补码)为1000 0000,这个最大负数在内存中的存储形式(补码)为 1000 0000.它表示是一个负数。
1000 0000(补码) ----》0111 1111(按位取反) ----》1000 0000(取反后加1)
1000 0000对应的值为128,由于符号是 - ,所以最小的负数是 -128。

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:57:09C
日期:2016-10-25 16:17:59
8 [报告]
发表于 2012-09-26 00:39 |只看该作者
分析得很有道理,谢谢!
bruceteen 发表于 2012-09-25 23:35
8个bits,每个bit可以是0可以是1,所以一共有2^8个组合,也就是说 char 可以表示 2^8个不同的数
用0000000 ...

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:57:09C
日期:2016-10-25 16:17:59
9 [报告]
发表于 2012-09-26 00:44 |只看该作者
整理成一个文档,保存下。

计算机中补码运算.rar

7.58 KB, 下载次数: 8

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
10 [报告]
发表于 2012-09-26 07:12 |只看该作者
shaohui973 发表于 2012-09-25 23:14
char a;
一个8bit位的有符号数据的范围 是 -128 ~ 127
网上搜罗了大量数据,没有一个解释清楚的,只是提到 ...


這種基礎知識你就應該查書。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP