什么是有符号数?
有符号数是针对于二进制来讲的,最高位表示符号位,“0”代表正,“1”代表负,其余位代表数。首先要搞清楚最高位是哪一位,以char型为例,一个字节最高位在第7位,那int型的最高位则为第31位。下图中红色字体为最高位。
Char 类型:
Int类型:
什么是无符号数?
无符号数的表示范围是非负数,全部二进制数均代表数值,没有符号位,即第一个“0”或“1”不表示正负。无符号数和有符号数相对,无符号数用unsigned表示,如:unsigne char I = 0x85,这样,即使i的最高位为1,也会因为unsigned的修饰而成为一个无符号数。
无符号数和有符号数的区别
范围区别
无符号数中,所有的位都会用来表示大小,有符号数中最高位用来表示正负,所以,当为正值时,该数的大小就会变小。以一个字节的值为例:
无符号数:1111 1111 值:255
有符号数:0111 1111 值127
同样一个字节,无符号数的最大值是255,而有符号数的最大值是127,这是因为有符号数的最高位被拿去当符号了,并且最高位的权位也是最高的,所以仅仅少一位,最大值会少一大半。
有符号数的长处在于,虽然它的最大值不占优势,但它可以用来表示负数,以一字节的值为例:
无符号数:0-255
有符号数:-128-0-127
同样是一个字节,无符号数的最小值是0,有符号数的最小值是-128,所以由此看来,二者表达的不同数值的个数都是256个,只是范围不相同而已。
看到这个表示范围,就又有一个新的问题了,有符号数表示的最小值是怎样计算出来的?
若最高位为1表示负数,而该负数的绝对值是多少呢?将每个二进制位(包含符号位)取反加1,得到一个二进制数,将该数看成是无符号数,其值就是上述负数的绝对值。
例如:二进制数10000000的最高位为1,所以它表示的是负数,是负的多少呢?我们将其八位全部取反,得到01111111,然后加1,得到10000000,将该数看作无符号数,值为128,故计算机中的10000000表示的是-128,最高位(即符号位)为1的8位有符号数有128个,故可表示128个负数;最高位为0的8位有符号数有128个,但全0的那个表示数0,所以总共只能表示127个正整数。