数据的表示 (原码反码补码移码)

发布于:2023-01-22 ⋅ 阅读:(6) ⋅ 点赞:(0) ⋅ 评论:(0)

目录

原码

反码

补码

移码

表示的范围


原码

1.原码是将数字转换为二进制。

2.原码必须符合八位,如果不满足八位就从右向左补0。(从右往左的最末尾位是符号位根据正负再判断补0或是补1)

3.原码的从右往左的最末尾位是符号位,正数为0,负数为1。

数值1 数值-1 1-1
原码 0000 0001 1000 0001 1000 0010

1 - 1 =0000 0001 + 1000 0001 = (1000 0010)2 (二进制,逢二进一)=(-2)10(十进制的-2)

1 - 1 按照常理应该为0,但是此处得出不为0,代表着原码间不可做运算。


反码

1.正数的反码还是原码。

2.负数的反码符号位不变。

2.负数的反码(除符号位)按位取反。

数值1 数值-1 1-1
原码 0000 0001 1000 0001 1000 0010
反码 0000 0001 1111 1110 1111 1111

1 - 1 进行反码运算为1111 1111,对其进行取反(跟取反码操作一致)就可知道其原码是(1000 0000)2 = (-0)10(就为-0)这在一定程度上来说反码间是可以进行运算的,但是0为负来说用反码来进行运算又不太准确。


补码

1.正数的补码还是原码

2.负数的补码= 反码+1

数值1 数值-1 1-1
原码 0000 0001 1000 0001 1000 0010
反码 0000 0001 1111 1110 1111 1111
补码 0000 0001 1111 1111 0000 0000

这时的1-1便是十进制的 0,代表着补码进行运算是比较准确的。


移码

  • 将符号位转变(正数为1,负数为0)

  • 这是因为在正常逻辑观念里,正数应该比负数大,这样在数轴上面也能更好的表示。也不难发现,这很好的解开了反码间的运算导致0出现负数的情况。

数值1 数值-1 1-1
原码 0000 0001 1000 0001 1000 0010
反码 0000 0001 1111 1110 1111 1111
补码 0000 0001 1111 1111 0000 0000
移码 1000 0001 0111 1111 1000 0000

移码间可以进行正常的运算。


表示的范围

为什么补码会比原码、反码少一位?

二进制 十进制 二进制 十进制
原码 0000 0000 0 1000 0000 -0
反码 0000 0000 0 1111 1111 -0
补码 0000 0000 0 0000 0000 -0

原码与反码的0与-0表示不同,而补码的0与-0表示相同,这就是补码比原码、反码少一位的原因。