「原码 反码 补码 移码」一探究竟(上)

抛开复杂的理论,直探事物的本质。

0. 二进制

相比于二进制,十进制数字大家都比较熟悉。从右往左依次是个位、十位、百位、千位等,每个位置上的数字范围 [0, 9]。个位上的 1 表示 1,十位上的 1 表示 10,百位上的 1 表示 100,即从右向左的第 n 位就代表 10^(n-1):

761 = 7*100 + 6*10 + 1*1 = 7*10^2 + 6*10^1 + 1*10^0

而二进制,也是同样的道理,区别就是将 10 的 n-1 次幂变成了 2 的 n-1 次幂:

1101 = 1*2^3 + 1*2^2 + 0*2^1 + 1*2^0 = 8 + 4 + 0 + 1 = 13

有了这些基础概念,接着再来看下面的内容。

1. 这些「码」都是什么?

计算机中的数字一般分为两种,有符号数和无符号数。

原码,是一种计算机中对数字的二进制表示的方法。

有符号数,即用最高位的二进制位来表示正负,剩下的位来存储数据。

无符号数,即所有的二进制位都来表示数据,所以无符号数字无法表示负数,全部大于等于 0。

光看定义干巴巴的,用长度为 8 位二进制的类型举几个例子。

有符号数,最高位表示正负,0 表示正数,1 表示负数。

   7 : [0000 0111]原
  -3 : [1000 0011]原
-127 : [1111 1111]原

无符号数,没有符号位,全部二进制位用来表示数据。

  7 : [0000 0111]原 
 16 : [0001 0000]原
255 : [1111 1111]原

上面就是原码的定义,而反码、补码、移码都是在原码的基础上做了对应的变换。

反码:正数的反码就是其原码,负数的反码为,符号位不变,其余位取反,即 0 变 1,1 变 0。

补码:正数的补码就是其原码,负数的补码为在其反码的基础上再加 1,而在计算机中,整数都是以补码的形式存储的。

移码:将补码符号位取反,即为移码。

这几种码都是针对有符号数,而无符号数用原码就足够了,后面会对此说明原因。同样,也举几个例子说明。

 7 : [0000 0111]原 [0000 0111]反 [0000 0111]补 [1000 0111]移
-3 : [1000 0011]原 [1111 1100]反 [1111 1101]补 [0111 1101]移

关于定义,就说这些。既然原码就能表示数字,那为什么又会有这么多类型的码呢?而这些不同的码又是怎么来的呢?计算机中为什么要以补码而不是其他码来存储整数呢?移码又是做什么的呢?鉴于篇幅过长,下篇文章,会对这些问题一一说明。


欢迎关注同名公众号「码一八」获取更多内容,用技术改变生活!
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值