C语言底层学习(1.二进制与原、反、补码)(超详细)

在这里插入图片描述

文章目录

    • 1. 二进制
      • 1.1 二进制和十进制转换
        • 1.1.1 十 - 二转换
        • 1.1.2 二 - 十转换
      • 1.2 二进制和八进制,十六进制转换
        • 1.2.1 二进制转换八进制
        • 1.2.2 二进制转换十六进制
    • 2. 原码,反码和补码
      • 2.1 他们是什么
      • 2.2 为什么要搞得这么麻烦

在这里开一个新的专栏

这个新专栏用来解释一些C语言相对来说更底层的东西

像是二进制码之类的东西

  • 这里是say-fall分享,感兴趣欢迎互三

1. 二进制

众所周知,计算机使用的是二进制,也就是010101…
而我们数学里面计算问题用的是十进制,除此之外常用进制其实还有八进制,十六进制等。
这样的话,我们就不得不面对进制转换的问题。

1.1 二进制和十进制转换

1.1.1 十 - 二转换

整数部分:除二余一,逆序排列
什么原理呢?
其实就是一个十进制整数可以写成几个二的次方相加
以63为例:
在这里插入图片描述

这样的话,除以2余1,就说明有2^0存在,先记录1
继续向下走,每次都会类似上面检查最后一个2^n并且记录0或1,最后再逆序输出就能得到二进制数字
小数部分:乘二取整,顺序排列
它的原理其实和整数部分一致
以0.625为例:
在这里插入图片描述

每次乘2就会顺序出现2^0,也就是小数部分第一位,记录0或1,最后再顺序输出

1.1.2 二 - 十转换

例如:111111.101
按照2的次方递增的顺序变成十进制然后全部相加,就等于63.625

1.2 二进制和八进制,十六进制转换

1.2.1 二进制转换八进制

从后往前个二进制转变为一个八进制数,不足3位的前面补0再转换

  • 例如:11 111 111
    111变为7,11变为3,整体则为八进制的 377
1.2.2 二进制转换十六进制

从后往前每四个二进制转变为一个八进制数,不足4位的前面补0再转换

  • 例如:111 1111 1111
    1111变成E(15),111变为7,整体则为十六进制的 7EE

2. 原码,反码和补码

2.1 他们是什么

  • 原码:先来说说原码是什么,原码其实就是在原有的二进制位前添加一个符号位,如果是正数符号位为0,负数的符号位为1.这样的话,就得到了原码
  • 反码:那什么是反码呢?首先,只有负数才有反码,正数的反码与原码一致。那顾名思义,反码就是与原码“相反”的一串二进制码。注意,这里的符号位不变。
    例如:1 11111 010101
    这串二进制码的反码为1 00000 101010
  • 补码:和反码一样,负数才有补码,整数的补码和原码一致。负数的补码就是在已有的反码基础上加1.

2.2 为什么要搞得这么麻烦

  • 为什么要引入原码,反码和补码的概念呢,下面我来解释一下与原因:
    其实是因为计算机在处理数字的时候实际上用的都是加法,这在计算两个正数的时候的没有任何问题的,当我们计算负数

  • 例如说,两个负数相加:1 010101 + 1 111111 = ?
    如果按照正常计算的话,应该等于1 1010100 也就是十进制的-84
    但是实际上,超出7位的首位就会被舍去,结果就会改变,比如说,这题的结果变为了1 010100也就是十进制的-20.

  • 再举个例子,两个数做差(或者一正一负相加):1 0101 + 0 1010 = ?
    正常计算的话,结果应该等于5(就是十进制-5和10相加)
    但是由于符号位的存在,他会把非符号位相加,符号位的正负也无法保证正确,就得到了结果 1 1111(十进制-15)

  • 这样的话我们就无法在计算机上计算负数或者是做减法了吗?
    并非如此,聪明的科学家发现了一件事情,下面以十进制举例:

  • -6是十进制的一个数,现在我们负号不变,只对数字本身做这样一个运算:10-6=4,我们就得到了一个4,当我们想要用1+(-6)的时候,发现结果为-5,而-5这个结果负号不变是不是等于将4和1相加再用10-5,就得到-5
    那我们就想:诶,这是不是一个巧合呀?

  • 再以-7举例,做同样的操作得到一个3当我们用1+(-7)就得到一个-6,刚好就等于3和1相加(得到4)再用10-4,保留负号,就得到-6.
    经过上面这一个很绕的解释,我们回头仔细研究一下就能发现,实际上的补码就是-7为原码,-3为补码的关系
    我来画图解释一下:
    在这里插入图片描述

    就如同表格里一样-10和-6相加,刚好就是-16,-3和-7也是这样的关系。
    通过这样的方式,我们就能对上面不能的运算进行处理

  • 这就是要引入原码,反码和补码的概念的原因。

本节完

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值