您的位置:首页 > 其它

为什么16位系统下,int类型能够表示的范围是:-32768到32767,而不是从-32767到32767呢?

2013-11-20 16:12 429 查看
其实这个问题对于初学者,即使以前学习过c语言的人,也是一个理解很头疼的问题,因为很少有书中能够详细解释为什么,而是直接给出范围。

百度里面回答各个不一,我还是比较信任其中一个答案,连接地址:http://zhidao.baidu.com/question/3838955.html?qbl=relate_question_0

我们知道c语言中int类型在vc下是32位的。这里理解上也是同样的道理。

摘自百度内容:

计算机用二进制表示负数是用的“补码法”,做法是正数按原码,负数用其相反数反码加一。
这种结果用-32768代替了“-0”,可以使符号位能与有效值部分一起参加运算,从而简化运算规则;同时使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计。

我说的:

(注:内容说用“-32768”代替“-0”,不好理解,最好还是理解为:用补码1000 0000作为十进制数-32768在内存中的存储形式。)

(这里1000 0000是补码形式,我们计算其真值的过程为取反加1,即1111 1111+1,这里符号位参加运算,并且溢出,丢掉,结果为0)

个人理解:

这里我们知道n位补码的表示范围为:

100......0->011......1 (第一个数是1后面n-1个0,第二个数是0后面n-1个1)。

例如8位补码能够表示的范围是:

1000 0000 -> 0111 1111

这里1 000 0000是计算机能存储的补码形式,即它表示为十进制数为:-128

如何理解呢?

我们举一个例子,假如计算机处理的数据长度为两位的,则两位二进制的组合形式有下面四种情况:

11 10 01 00

而且我们定义的处理的这个数据是有符号的,即第一位表示符号位。那么我们计算它代表十进制数是什么,计算的方式就是和十进制计算补码的方式相同,即符号位不变,其他位取反加1。计算结果如下:

补码 -> 取反->加1

11  ->10 ->11 ,则真值是-1。

10 ->11->00,则真值是0。(这里补码进行运算时,符号位也参加运算,由符号位计算产生的进位将抛弃)。

01 ->00 ->01,则表示真值是1。

00 ->01 ->10,则表示的真值是-0。

注释:这里我们计算是利用补码的计算法则,上面黄色的两个地方计算机处理的操作是这样的:10用来替代-2,00表示0;在计算机中+0和-0的补码形式均是000...00,全0形式。

我们观察上面的第四个结果,我们知道十进制-0和0都表示0,那么两位二进制的组合有四种情况,我们的十进制结果才三种情况,其实在这里一个有效的处理就是,将10表示为-2。即这样表示的十进制范围也是4个即:-2,-1,0,1。这里为什么会用10表示-2,而不是表示为2,即范围:-1,0,1,2。也是有根据的。就如上面的讲到的那样,计算机之所以用补码形式是因为补码运算可以连同符号位一起参加运算,这便于运算器的设计和实现。为了进一步解释这一点,我们用8位的二进制数据进行操作和验证结果的正确性:

8位二进制能够表示的范围是:-128到127。即1000 0000表示-128。53的补码是:0011 0101

我们计算-128+53=-75。计算机操作为:1000 0000 +0011 0101=1011 0101 补码运算的结果也是补码,然后将补码转换为真值,即:

1011 0101=1100 1010+1=1100 1011,即真值。第一个表示符号位,则十进制的真值为:-75

我们验证表明之所以选择补码形式为1000 0000为-128,是因为它能很好的参加运算并且简化了硬件电路的设计与实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐