标题:C的int数据类型要占17个Bit位?
只看楼主
freepig
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2006-1-5
得分:0 

我找了好几本C语言的书,都是说最小值是 -(2^15-1)啊


2006-02-28 22:31
iyuohz
Rank: 1
等 级:新手上路
帖 子:107
专家分:0
注 册:2006-2-22
得分:0 
以下是引用freepig在2006-2-23 15:23:00的发言:

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

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

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

都说的是啥呀?有点晕了~~~
32767=0111 1111 1111 1111对不?
16位 的最高位 代表的是 正负号,并且32767的补码是
1000 0000 0000 0001=-32767
所以
1000 0000 0000 0000=-32768

不能说 1,1000,0000,0000,0000是16位 -2^15的原码
正数的补码 取反加1 对应的是其负数的补码负数的补码 取反加1 对应的是其绝对值

0111 1111 1111 1111 : 32767
0000 0000 0000 0001 :1
0000 0000 0000 0000 :0
1111 1111 1111 1111:-1
1000 0000 0000 0001:-32767
1000 0000 0000 0000:-32768


以下是引用cordier在2006-2-23 17:35:00的发言:
实际上就是正零与负零的区别了
对于0000,0000,0000,0000这个是正零
而 1000,0000,0000,0000这个是负零,也就是-32768。

在补码里:假设有 负零的话 应该是 0按位取反 再加1
0 :0000 0000 0000 0000
取反 :1111 1111 1111 1111
加 1:0000 0000 0000 0000 (因为 限定了 16 位 这个范围,所以 +1 也不能 向前进1)

因此,补码有效的解决了 出现 正负 0 这个问题,因此 0 不会出现 重码 这个现象

[此贴子已经被作者于2006-3-1 9:56:38编辑过]


2006-03-01 09:44



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-46788-1-1.html




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

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