第2篇:
signed、unsigned
有没有符号――signed、unsigned关键字
我们知道计算机底层只认识0、1.任何数据到了底层都会变计算转换成0、1.那负数怎么存储呢?
肯定这个“-”号是无法存入内存的,怎么办?很好办,做个标记。把基本数据类型的最高位腾出来,用来存符号,同时约定如下:最高位如果是1,表明这个数是负数,其值为除最高位以外的剩余位的值添上这个“-”号;如果最高位是0,表明这个数是正数,其值为除最高位以外的剩余位的值。
我们的signed关键字也很宽恒大量,你也可以完全当它不存在,编译器缺省默认情况下数据为signed类型的。
然而,负数并不仅仅是简单的以符号+数据存储的。而是通过一种叫做补码的形式来存储。补码就是通常所说的:按位取反再加一。为什么要这样设计呢?
为什么要用补码?
下面我来解释一下为什么补码可以实现减法当做加法。
我们假设一个数字A,它的正数表示,我们称为”正”,它的相反数,我们称为”负”,我们知道:
负 +正 = 0
在计算机做加法的时候,如果最高位(符号位)有进位,则进位被舍弃。我们可以利用溢出,来让两个数相加结果变成0。(这里假设只有1个Byte)
负 +正 = 1 0000 0000 (这里是二进制表示)
这里,如果1这个位置是溢出了,因此计算机直接丢掉最高位1,变成:
负 +正 = 0;
我们假设,数字A的正数表示形式按位取反结果为”反”,很容易知道:
正 +反 = 1111 1111
正 +反 + 1 = 1 0000 0000
右边会丢弃最高位,变成
正 +反 + 1 = 0
结合公式
正 +负 = 0
得到:
负 =反 + 1;
这就是负数的按位取反再加一的由来。