前言:
- 所有信息在机器上都是以0、1的方式进行存储的。
- 原码、反码、补码事机器存储的一个具体数字的编码方式。
原码:
- 如果机器字长为n,那么一个数的原码就是用一个n位的二进制数,其中最高位为符号位:正数为0,负数为1。剩下的n-1位表示概数的绝对值。一个字节(byte)由8个比特(bit)构成。如果位数不够可在符号位后进行补全;
- X=+00 0001 , [X]原= 0000 0001
- X=-00 00001, [X]原= 1000 0001
位数不够的用0补全。
反码:
- 反码:很好理解,就是原来的数据位上的数取反,但要注意,正数不变,仅负数取反,注意只是数据位哦。
为什么有了原码还要有反码的出现呢?
场景: 1-1=0 =》1+(-1)=0
计算机设计之初为了尽量把逻辑电路简单化,机器只有两个数的加操作,而没有减操作,那么机器是如何计算两数相减的呢,答案是根据二进制左边第一位的符号位,计算机将符号位也纳入计算范围内:
用原码进行计算:
1-1=1+(-1)=[0000 0001] + [1000 0001] = [1000 0010] = -2(因为左边第一位为符号为),所以加入机器用原码进行减法计算时就会出错。
- X=00 0001 , [X]原= 0000 0001 ,[X]反= 0000 0001
- X=-00 0001 , [X]原= 1000 0001 ,[X]反= 1111 1110
补码:
- 补码:同样很好理解,正数的补码等于原码等于反码,负数的补码等于负数的反码+1
- X=00 0001 , [X]原= 0000 0001 ,[X]反=0000 0001,[X]补=0000 0001
- X=-00 0001 , [X]原= 1000 0001 ,[X]反=1111 1110,[X]补=1111 1111
- 0的补码是唯一的,如果机器字长为8那么[0]补=00000000。
移码:
- X=00 0001 , [X]原= 0000 0001 ,[X]反=0000 0001,[X]补=0000 0001,[X]移=1000 0001
- X=-00 0001 , [X]原= 1000 0001 ,[X]反=1111 1110,[X]补=1111 1111,[X]移=0111 111