C语言:二进制和进制转换的介绍以及原,反,补码

一,进制的介绍

在计算机科学中,二进制是非常重要的概念,同时不同进制之间的转换也是基础操作。下面将详细介绍二进制以及二进制与其他常见进制(十进制、八进制、十六进制)之间的转换方法。

1. 二进制概述

1.1 我们重点介绍⼀下⼆进制:

      ⾸先我们还是得从10进制讲起,其实10进制是我们⽣活中经常使⽤的,我们已经形成了很多尝试:
     10进制中满10进1
     10进制的数字每⼀位都是0~9的数字组成
     其实⼆进制也是⼀样的
      2进制中满2进1
      2进制的数字每⼀位都是0~1的数字组成
      那么 1101 就是⼆进制的数字了。

1.2 二进制是一种以 2 为基数的计数法,它只使用 0 和 1 两个数字。在计算机系统中,数据的存储和处理基本上都是基于二进制的,因为计算机的硬件电路更容易实现两种状态(如通电和断电、高电平和低电平),正好可以用 0 和 1 来表示。

1.3 其实10进制的123表⽰的值是⼀百⼆⼗三,为什么是这个值呢?其实10进制的每⼀位是有权重的,10

进制的数字从右向左是个位、⼗位、百位....,分别每⼀位的权重是 10 , 10 , 10 ...
如下图:
10进制的位 1 2 3
权重 10^2   10^1 10^0
权重值 100    10 1
求值    1*100   +   2*10  +    3 * 1  = 123

1.4  2进制和10进制是类似的,只不过2进制的每⼀位的权重,从右向左是: 2 ^0, 2^1 , 2^2 ... AA

如果是2进制的1101,我们可以通过表格快速了解:

2进制的位 1 1 0 1
权重 2^3 2^2 2^1 2^0
权重值 8 4 2 1
求值 1*8           +     1*4       +     0*2     +    1*1= 13

 1.5 8进制和16进制转10机制也是和上面一样。如下:8进制:67,16进制:37

如下:

8进制的位 6 7
权重 8^1 8^0
权重值 8 1
求值       8*6      +     1*7 55
16进制的位 3 7
权重 16^1 16^0
权重值 16 1
求值 16*3    +     1*7  = 55

2. 10进制转2进制数字:88

C语言:二进制和进制转换的介绍以及原,反,补码_第1张图片
由下往上依次所得的余数就是10进制转换出的2进制:1111101

3. 10进制转16进制数字:88

C语言:二进制和进制转换的介绍以及原,反,补码_第2张图片
从下往上取余数,所以十进制数 88 转换为十六进制数是 58。

4. 10进制转8进制数字:88

C语言:二进制和进制转换的介绍以及原,反,补码_第3张图片
从下往上读取余数,所以十进制数 88 转换为八进制数是 130。
5. 2进制转8进制和16进制

5.1 2进制转8进制

8进制的数字每⼀位是0~7的,0~7的数字,各⾃写成2进制,最多有3个2进制位就⾜够了,⽐如7的⼆
进制是111,所以在2进制转8进制数的时候,从2进制序列中右边低位开始向左 每3个2进制位会换算⼀个8进制位 ,剩余不够3个2进制位的直接换算。
如:2进制的 01101011,换成8进制:0153,0开头的数字,会被当做8进制。
2进制
0 1 1 0 1 0 1 1
8进制

     1

          5

        3

5.2 2进制转16进制

16进制的数字每⼀位是0~9, a~f 的,0~9, a~f的数字,各⾃写成2进制,最多有4个2进制位就⾜够了,
⽐如 f 的⼆进制是1111,所以在2进制转16进制数的时候,从2进制序列中右边低位开始向左 每4个2进制位会换算⼀个16进制位 ,剩余不够4个⼆进制位的直接换算。
如:2进制的01101011,换成16进制:0x6b,16进制表⽰的时候前⾯加 0x
2进制 0 1 1 0 1 0 1 1
16进制

            6

            b

6. 原码、反码、补码

整数的2进制表⽰⽅法有三种,即原码反码补码
有符号整数的三种表⽰⽅法均有符号位数值位两部分,2进制序列中,最⾼位的1位是被当做符号
位,剩余的都是数值位。
符号位都是⽤0表⽰“正”,⽤1表⽰“负”。
正整数的原、反、补码都相同。
负整数的三种表⽰⽅法各不相同。
原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:反码+1就得到补码。
补码得到原码也是可以使⽤:取反,+1的操作。
列:正数5(正数原,反,补码都是一样的)
  • 原码:00000101
  • 反码:00000101
  • 补码:00000101
  • 列2:正数-5
  • 原码:10000101(最高位为符号位,其他位为数值位,负数符号位是 1.)
  • 反码:11111010(负数的反码是在原码基础上,符号位不变,其余各位取反)
  • 补码:11111011(负数的补码是在反码基础上加 1,11111010 + 1 = 11111011 )
对于整形来说:数据存放内存中其实存放的是补码。
为什么呢?
在计算机系统中,数值⼀律⽤补码来表⽰和存储。原因在于,使⽤补码,可以将符号位和数值域统⼀ 。
处理;同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算
过程是相同的,不需要额外的硬件电路。

你可能感兴趣的:(c语言,开发语言)