补码二进制计算机为什么要用补码存储整型,关于-32768的问题
这几周笔者几篇文章介绍了改补码二进制的文章. 关联文章的地址
数值的补码表现也分两种情况:
(1)正数的补码:与原码雷同。
例如,+9的补码是00001001。
(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。
例如,-7的补码:因为是负数,则符号位为“1”,整个为10000111;其余7位为-7的绝对值+7的原码0000111按位取反为1111000;再加1,所以-7的补码是11111001。
计算机为什么要用补码存储整型
这得从二进制的原码说起:
如果以最高位为符号位,二进制原码最大为0111111111111111=2的15次方减1=32767
最小为1111111111111111=-2的15次方减1=-32767
此时0有两种表现方法,即正0和负0:0000000000000000=1000000000000000=0
所以,二进制原码表现时,范围是-32767~-0和0~32767,因为有两个零的存在,所以不同的数值个数一共只有2的16次方减1个,比16位二进制可以提供的2的16次方个编码少1个。
但是计算机中采取二进制补码存储数据,即正数编码稳定,从0000000000000000到0111111111111111依旧表现0到32767,而负数需要把除符号位当前的部分取反加1,即-32767的补码为1000000000000001。
到此,再来看原码的正0和负0:0000000000000000和1000000000000000,补码表现中,前者的补码还是0000000000000000,后者经过非符号位取反加1后,同样酿成了0000000000000000,也就是正0和负0在补码系统中的编码是一样的。但是,我们知道,16位二进制数可以表现2的16次方个编码,而在补码中零的编码只有一个,也就是补码中会比原码多一个编码出来,这个编码就是1000000000000000,因为任何一个原码都不可能在转成补码时酿成1000000000000000。所以,人为规定1000000000000000这个补码编码为-32768。
所以,补码系统中,范围是-23768~32767。
因此,实际上,二进制的最小数确实是1111111111111111,只是二进制补码的最小值才是1000000000000000,而补码的1111111111111111是二进制值的-1。
整型的宽度是一个字,也就是2个字节,16个二进制位,最高一名二进制位用来表现符号(正或负),那么剩下的15位来表现数值。
所以,有:
01111111 11111111是32767,最大的正整数
00000000 00000001是1
00000000 00000000是0
11111111 11111111是-1(不是-32767)
10000000 00000001是-32767(不是-1)
10000000 00000000是-32768(不是-0),最小的负整数
-32768在内存中的表现是10000000,00000000。进程是:先读入正值32768(10000000,00000000),再取反(01111111,11111111),再加1(10000000,00000000)
计算机表现数主要从运算方法的一致性来考虑。
比如00000000 00000001表现1很好理解,但是11111111 11111111为什么是-1呢?
按照二进制加法
11111111 11111111 + 00000000 00000001= 1 00000000 00000000
结果超出了整型的宽度,溢出部分被疏忽,最后的计算机结果是00000000 00000000
那么换成十进制,?+1=0,所以11111111 11111111表现成十进制就是-1
文章结束给大家分享下程序员的一些笑话语录:
自行车
一个程序员骑着一个很漂亮的自行车到了公司,另一个程序员看到了他,问 到,“你是从哪搞到的这么漂亮的车的?”
骑车的那个程序员说, “我刚从那边过来, 有一个漂亮的姑娘骑着这个车过来, 并停在我跟前,把衣服全脱了,然后对我说,‘你想要什么都可以’”。
另一个程序员马上说到, “你绝对做了一个正确的选择, 因为那姑娘的衣服你 并不一定穿得了”。
---------------------------------
原创文章 By
补码和二进制
---------------------------------