原码、反码、补码、移码概念
原码
就是未经更改的码,使用最高位表示符号位,正数为0,负数为1,剩下的事表示该树的绝对值。故8位字节表示的数字范围为 127(2^7-1) ~ -128(-2^7+1)。
例子:数字 127 表示为 0111 1111,数字-127表示为 11111111
反码
反码就是在原码的基础上,符号位不变,各位取反
例子:数字 127 表示为 0000 0000 ,数字 -127 表示为 1000 0000。
补码
补码就是在原码的基础上,符号位不变,各位取反,末位加一。
例子:数字 127 表示为 0000 0001 ,数字 -127 表示为 1000 0001。
负数转正数先 -1 再取反 。例:1111 1110 表示 -2;先 -1,得到 1111 1101,取反得到 0000 0010,即为正数 2 。
负数转正数先取反再 +1,再将符号位之外各位取反。例:-163 二进制为 1 0101 1101,先 取反,1 1010 0010,再 +1,得到 1 1010 0011,去掉符号位,得到1010 0011 , 转换为10进制为 163
移码
将补码符号位取反即可
例子:数字 127 表示为 1000 0001 ,数字 -127 表示为 0000 0001
与、或、非、取反运算
与:都为1,结果为1,否则为0。
或:一个为1,结果为1,否则为0。
异或:两个值不同为1,否则为0。同为真,假为异。
非:即取反,1变0,0变1。
十进制正数转二进制负数
先十进制转二进制原码,再转反码,再把反码加1。
二进制负数转10进制
先二进制负数-1,再取反,即可得到十进制的正数二进制。
二进制负数转10进制
1011 = -1 * 2的3次方 + 0 * 2的2次方 + 1 * 2 + 1 * 2的0次方 = -8 + 0 +2+1 = -5
十进制负数转二进制
除2取余,逆序排列,得到原码,然后取反,反码加一得到补码,就是二进制表示。
如:-9 除2取余后为:1 0 0 1 得到原码 0000 1001,取反:1111 0110,加一 1111 0111
正数的反码和补码都与原码相同。
负数的反码为对该数的原码除符号位外各位取反。
负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1
源码:优点在于换算简单 缺点在于两个零 加减法需要独立运算
反码:有点在于表示清晰 缺点在于两个零 加减法同样需要独立运算
补码:优点在于一个零 范围大 减法可以转为加法 缺点在于理解困难