整数类型的储存spa
前面 所说的位运算都没有涉及负数,都假设这些运算是在unsingned/word类型(只能表示正数的整型)上进行操做。设计
但计算机如何处理有正负符号的整型呢?这个设计到补码,反码知识点,请看下面硬件
假设有一 int 类型的数,值为5,那么,咱们知道它在计算机中表示为:00000000 00000000 00000000 00000101
5转换成二进制是101,不过int类型的数占用4字节(32位),因此前面填了一堆0。
如今想知道,-5在计算机中如何表示?
在计算机中,负数以其正值的补码形式表达。数据类型
什么叫补码呢?这得从原码,反码提及。二进制
反码,补码数据
所谓原码就是前面所介绍的二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其他位表示数值的大小。margin
反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。top
补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。word
有原码就能够了,为何还须要反码和补码?计算机
反码是用来算补码的,原码和补码都是用在CPU的基本运算里的,好比数据类型是short:
计算5 - 2,并因为实际上CPU没有实现减法电路(注:计算机的硬件结构中只有加法器,因此大部分的运算都必须最终转换为加法,原码没有办法作减法,而在咱们使用的汇编、C等其余高级语言中使用的都是原码,原码转换成补码都是在计算机的最底层进行的)。原码计算是 5+(-2)
0101
+1010
-------
1111
=-7?显然出错
因此无论正数仍是负数,都使用补码来表示(正数原码和补码是同样的), 2的补码是1110,而后用5补 + 2补
0101
+ 1110
------
0011
=3,正确