关于16位最小数是-32768问题。符号位和最高位。
16位,第一位是符号位,所以只有15位的数据?
都说范围是-32768~32767
首先 32768 原码(1000 0000 0000 0000)
所以最大正数是 32767 (0111 1111 1111 1111)最高位是符号位,没毛病。
我的问题是下面:
我想问-32768原码难道不是?(1 1000 0000 0000 0000 0000)这样的话就有17位了
但是计算机是存的16位补码,那-32768的补码难道不是(1 1000 0000 0000 0000)
最高位符号位同样是顶到17位去了?可我这个是16位计算机啊
书上说-32768的补码是(1000 0000 0000 0000)
在16位计算机第一位是符号位的情况,这个补码是怎么得来的?符号位呢?
然后(1000 0000 0000 0000)补码形式,最高位为符号位。把这个还原成原码,这个不是-0的原码,补码么?按照符号位不动,末位减一,各位取反。
我现在已经特别蒙蔽了。为啥我算的-32768 带有符号位的是17位,书上写的最高位符号位的是16位。
最小数本是-32767,只是有一个0的问题;
两种表示一个0有点浪费,所以人为规定用-0表示-32768,+0表示0。
剩下15位二进制数的最大值是每一位数都是1的情况:
即2^15-1=32767,32768化成二进制为1000 0000 0000 0000,对于带符号整数来说就是-0。
我们看32767加上1的情况:-
一般在计算机上的话应该是-32768的结果。
原因:
32767二进制:0111 1111 1111 1111B
32767加上1,运算电路将该值修改为:
1000 0000 0000 0000B(注意一般无特殊保护逻辑的电路不能区分符号位,所有位一视同仁)
当软件读取该值时,由于符号位(最高位)为1,于是将其视为补码(计算机中以补码存储负数),于是对其取原码得到上述值。
总共2的16次方共65536个数,0算一个数,剩下的65535个数分成正数和负数两组,肯定两组含有的数值的个数是不等的如果0算两个数(例如一个正0一个负0),或者多加一个表示运算出错(不表示任何数)的“错误值”,那么正数和负数两组的个数就能相等了——不过这样用起来会很奇怪吧,比如正0和负0的值相等,却是不同的数