| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付学习型 ASP/PHP/ASP.NET 主机 30元/年
高端软件开发 = 年薪十万不是梦赛孚耐:软件保护加密专家身份认证令牌USB KEY 
共有 505 人关注过本帖
标题:C的int数据类型要占17个Bit位?
收藏  订阅  推荐  打印 
freepig
Rank: 1
等级:新手上路
帖子:15
积分:250
注册:2006-1-5
C的int数据类型要占17个Bit位?

今天突然发现一个问题,搞得我头都大了。说出来都不相信,就是int的数据的最小值。

大家都知道,int用16个bit位表示数据,如果是有符号的则只有15位才能表示,则最大值是2^15-1。

那么最小值是多少呢?
大家也知道,就是-32768,怎么来的?
负的2的15次方,是吧。

问题来了,负的2的15次方,的原码是多少?1,1000,0000,0000,0000,注意我写的是原码,这用了17位空间。
而负数在计算机中是以补码形式存放的,负的2的15次方的补码应该是:1000,0000,0000,0000,而这里正好用了16位。
其实这里不止16位,我把前面的0省略了0,1000,0000,0000,0000。
那int类型的数据不是用了17个bit位吗?

大家帮我看看,我到底错在哪里了?

[此贴子已经被作者于2006-2-23 16:34:49编辑过]

搜索更多相关主题的帖子: int  Bit  类型  数据  
2006-2-23 15:23
amzyb
Rank: 2
等级:注册会员
帖子:76
积分:860
注册:2005-1-10

1000 0000 0000 0000代表的是-0111 1111 1111 1111,这个是-(1+2+2^2+...+2^14)=-(2^15-1)是最小值,最小值不应该是-2^15.同样最大值是0111 1111 1111 1111,是2^15-1,而不是2^15。
这样就没有了您所说的int数据类型要17Bit的问题了吧??

独家之见,欢迎批评指正!:)
2006-2-23 15:47
freepig
Rank: 1
等级:新手上路
帖子:15
积分:250
注册:2006-1-5

谢谢楼上的
最大值是错了,应该是2的15次方减1。
最小值应该没错,就是负的2的15次方
但是1000,0000,0000,0000是负的2的15次方的补码啊。

负的2的15次方的原码是这个吗?1,1000,0000,0000,0000

2006-2-23 16:13
freepig
Rank: 1
等级:新手上路
帖子:15
积分:250
注册:2006-1-5

我又看了下,才看清楚。
其实我们的想法一样,但是我现在书上的写的是无符号的int最小值就是-2^15.

是老谭的书啊

2006-2-23 16:20
freepig
Rank: 1
等级:新手上路
帖子:15
积分:250
注册:2006-1-5

-0111 1111 1111 1111
不是17位吗?

2006-2-23 16:36
carbon
Rank: 1
等级:新手上路
帖子:1
积分:110
注册:2006-2-23

负的2的15次方,的原码是多少?1,1000,0000,0000,0000,注意我写的是原码,这用了17位空间。
这里 负的2的15次方,的原码0,1000,0000,0000,0000此时溢出,

实际上在计算机内部-32768是用来表示"-0"的,可以使符号位能与有效值部分一起参加运算,从而简化运算规则,那么

-32768的补码
1000,0000,0000,0000 的意思是-0,1是符号位。所以还是16位

2006-2-23 16:45
cordier
Rank: 3Rank: 3
等级:中级会员
威望:1
帖子:410
积分:4236
注册:2006-2-9

实际上就是正零与负零的区别了
对于0000,0000,0000,0000这个是正零
而 1000,0000,0000,0000这个是负零,也就是-32768。

2006-2-23 17:35
freepig
Rank: 1
等级:新手上路
帖子:15
积分:250
注册:2006-1-5

谢谢楼上的
不过我还是有点不明白,为什么要硬要溢出,也要把最小值定为-2^15呢?

还有,溢出之后的数据不是发生变化了吗?
溢出之前是1,1000,0000,0000,0000(原码)
溢出这后是 1000,0000,0000,0000([原码),那岂不是变成了2^15吗?



我怎么感觉最小值应该是-(2^15-1)

[此贴子已经被作者于2006-2-24 23:20:06编辑过]


2006-2-24 23:07
freepig
Rank: 1
等级:新手上路
帖子:15
积分:250
注册:2006-1-5

我就这个问题还请教了一位数学系的教授,他也说过这里实际上是一个正零,负零的问题.

他的推测,在计算机中存放负数是不存在原码的,直接以补码形式存放.如果这个理论成立的话,我的问题就解决了,因为经过计算-2^15的补码只有16位,所以就不存在17个BIT的问题了


2006-2-24 23:25
freepig
Rank: 1
等级:新手上路
帖子:15
积分:250
注册:2006-1-5

还是不明白,有高手来帮帮我吗

2006-2-25 22:53
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.070313 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved