简介:
首先我们都应该知道的是 当一个数是有符号的时候 比如int(16位)、char(8位)、long(32位),无符号 在前面加上unsigned 便可。
就拿char(8位来说) 7表示为 00000111 ;-7表示为 11111001;怎么转换呢?
很简单,正数的补码是自身,负数的补码是取反再加1,上面取反+1之后 00000111。
容易理解吧?简单的就是说,有符号数是用补码形式表示的。
为什么要用补码呢?
因为补码有一个好处,加法可以直接相加,而不用判断符号位。
就拿上面的 7 和 -7 相加 那么结果就是00000000 就是零。7 + (-6)呢? -6为(相应的,变为有符号表示为,无符号-1,再取反,为11111010) 相加的结果是 00000001。 同理 7 +(-8),结果是11111111,结果是-1。
应用:
现在是八位,如果一个六位的有符号数怎么办呢?
计算机格式已经规定死了(8、16、32位),6位的话,我就就用8位来表示。
怎么表示? 很简单,其他两位当做符号扩展(现在6位的话,符号位在第六位,符号扩展的意思是,如果第六位是1那么7 8 位也为1 ,否则为0) 让我们看看效果。就那上面的 -7 来说,6位应该是111001,符号扩展后为11111001 用char显示 为-7。
这个有什么用,简单就是硬件中的数据传输,有时候需要传送多个数据,a1、a2、a3等,不想传完 a1 再 a2 ,之后需要将数据打包成
a1 + a2 + a3 位 然后再解包,然后再还原为有符号型的。