二进制有原码 反码 和补码
计算机中在运算时使用的都是补码
btye 类型 (-128)- (127)
btye类型在java中站一个字节 一个字节=8位(bit)
计算机只能存储0和1
1111 1111
当全部存满时算出来是255
如果只是这样的话负数怎么表述 如果上述的 1111 1111 的十进制是255的话显然没有地方可以标识符号了
所以计算机中规定 1开头是负数 1111 1111 实际上是 -127
正数127的二进制是 0111 1111
当 0111 1111 和 0000 0001相加时 一般等于128 但是超过了btye的范围 会报错
补码
二进制直接存储都是补码
正数的话原码和补码都是相同的
原码
二进制运算时都是要使用原码进行运算
正数的话原码和补码都是相同的
反码
当负数要从补码转化成原码时就要先转换成反码
反码也很简单就是把除符号位 之外全部取反
1111 1110 (-126的补码)的反码是 1000 0001(-126的反码)
再转化为原码 (原码就是反码 +1)1000 0010(-126的原码)
1000 0000是-128的补码
1111 1111是-128的反码
1 1000 0000是-128的原码
1111 1111是-127的补码
1000 0000是-127的反码
1000 0001是-127的反码
1000 0010
0000 0001
1000 0011(上述两个相加完之后的结果 按理说是 -125)
先是 (125) 0111 1101
加上符号 1111 1101
取反 1000 0010
+1转原码 1000 0011 和上面运算结果相同
0111 1111 (127的二进制)
1000 0001 (-1的二进制)
1 0111 1110 这明显就不对了 应该是(0111 1110 (126的二进制))
这里就要涉及到溢出了 二进制设计很巧妙
就像看手表一样 虽然是24小时但是人一般习惯 12个小时那样的叫
从下午2点到早上10点 可以拨动时针 逆时针4位 也可以顺时针8位
2 + 8 = 10
2 - 4 = 10 实际上是 (2 + (12 - 4) = 10)
有负数的运算就 2 + (-4) -4的原码就相当于是(12 -4)
因为它是实际上是12进制算是