[原码反码补码]傻傻搞不懂?
个人导航
知乎:https://www.zhihu.com/people/byzh_rc
CSDN:https://blog.csdn.net/qq_54636039
注:本文仅对所述内容做了框架性引导,具体细节可查询其余相关资料or源码
参考文章:各方资料
目录
- [原码反码补码]傻傻搞不懂?
- 个人导航
- 原码
- 反码
- 补码
- 理解
- 公式
原码
最高位表示符号位(0表示正数, 1表示负数)
其余位表示数值的大小
数的正负之分只有符号位的变化 ->原码不能做加减法
负数原码-正数原码 1000 0100(-4) - 0000 0001(+1) ----------------- 1000 0011(-3)本质上是− ( 4 − 1 ) = − 3 -(4-1)=-3−(4−1)=−3
反码
正数的反码就是自身
负数的反码是由原码符号位不变,其余位取反得到
负数反码-正数反码 1111 1011(-4) - 0000 0001(+1) ----------------- 1111 1010(-5)结果对了(结果是负数)
负数反码+正数反码 1111 1100(-3) + 0000 0101(+5) -------------------- 0000 0001(+1)结果少1(结果是正数)
正数反码+负数反码 0000 0111(+7) + 1111 1100(-3) ---------------------- 0000 0011(+3)结果少1(结果是正数)
补码
正数的补码与原码相同
负数的补码为其反码加1
负数补码+正数补码 1111 1101(-3) + 0000 0101(+5) -------------------- 0000 0010(+2)对了!
理解
原码是太极形状, 方向相同没法连起来
反码: 数值上没毛病, 但是二进制上却差1
补码: 方向可以连起来 -> 完成加减法的定义(类似数轴)
公式
[ X ] 补 = ( 2 n + [ X ] 原 ) m o d 2 n [X]_{\text{补}} = \left(2^n + [X]_{\text{原}}\right) \mod 2^n[X]补=(2n+[X]原)mod2n
例子1:正数(X = 10 X=10X=10)
代入公式:
[ 10 ] 补 = ( 2 8 + 10 ) m o d 2 8 = ( 256 + 10 ) m o d 256 = 266 m o d 256 = 10 \begin{align} [10]_{\text{补}} &= (2^8 + 10) \mod 2^8 \\ &= (256 + 10) \mod 256 \\ &= 266 \mod 256 \\ &= 10 \end{align}[10]补=(28+10)mod28=(256+10)mod256=266mod256=10
二进制表示:10 1010的8位补码是00001010(和原码一致)
例子2:负数(X = − 10 X=-10X=−10)
代入公式:
[ − 10 ] 补 = ( 2 8 + ( − 10 ) ) m o d 2 8 = ( 256 − 10 ) m o d 256 = 246 m o d 256 = 246 \begin{align} [-10]_{\text{补}} &= (2^8 + (-10)) \mod 2^8 \\ &= (256 - 10) \mod 256 \\ &= 246 \mod 256 \\ &= 246 \end{align}[−10]补=(28+(−10))mod28=(256−10)mod256=246mod256=246
二进制表示:246 246246的8位二进制是11110110(对应“原码取反+1”的结果:− 10 -10−10原码是10001010,取反得11110101,加1得11110110)
例子3:零(X = 0 X=0X=0)
代入公式:
[ 0 ] 补 = ( 2 8 + 0 ) m o d 2 8 = 256 m o d 256 = 0 \begin{align} [0]_{\text{补}} &= (2^8 + 0) \mod 2^8 \\ &= 256 \mod 256 \\ &= 0 \end{align}[0]补=(28+0)mod28=256mod256=0
二进制表示:8位补码是00000000(唯一表示,无“-0”)
例子4:补码特殊值(X = − 128 X=-128X=−128,8位)
代入公式:
[ − 128 ] 补 = ( 2 8 + ( − 128 ) ) m o d 2 8 = ( 256 − 128 ) m o d 256 = 128 m o d 256 = 128 \begin{align} [-128]_{\text{补}} &= (2^8 + (-128)) \mod 2^8 \\ &= (256 - 128) \mod 256 \\ &= 128 \mod 256 \\ &= 128 \end{align}[−128]补=(28+(−128))mod28=(256−128)mod256=128mod256=128
二进制表示:10000000(没有对应原码,是补码特有的)