• 【C语言篇】☞ 8. 进制、原码、反码、补码


    进制

    1. 基本概念

      进制:是一种计数的方式,数值的表示形式

      十进制:逢十进一        (如:13 == 1 * 10 + 3)

      八进制:逢八进一        (如:15 == 1 * 8 + 5)

      二进制:逢二进一        (如:1101 == 1 * 2 * 2 * 2  + 1 * 2 * 2 + 0 * 2+ 1)

      十六进制:逢十六进一  (0 ~ 9  A ~  F        d  ==  13)

    int num = 12; //默认就是10进制

    int num1 = 014; //在前面加上一个0就代表八进制

    printf("%d ", num1); //%d是以十进制的方式输出一个整数

    printf("%o ", num); //%o是以八进制的方式输出一个整数

        

    int num2 = 0b1100; //在数值前面加上0b0B就代表二进制

    printf("%d ", num2); //C语言中没有提供二进制的输出格式符

     

    int num3 = 0x6c; //在数值前面加上0x就代表十六进制

    printf("%d ", num3);

    printf("%x ", num); //%x是以十六进制的方式输出一个整数

    2. 常见的进制转换

      10—>2:除2取余法,把10进制数除以2,然后取得余数的序列,再倒序。

        方法:整数部分2取余法,小数部分2取整法,高位补0,将得到的余数倒序得到的序列就是二进制的形式。

     

     例如:将十进制(97)转换为二进制数(1100001

           

      2—>10:所有位的位权相加:101=1*20+0*21+1*22

      2—>1641法。把一个二进制数,整数部分从右向左(小数部分从左向右)4位结合成1位,不足部分补0

          

      16—>214法,16进制的1位拆成二进制的4位。

          

      2—>831

          

      8—>213

      10—>8:除8取余

    原码、反码、补码

    1. 机器数和真值

      在学习原码、反码和补码之前,需要先了解机器数和真值的概念

      

    • 机器数(二进制数):

        一个数在计算机中的二进制表示形式,叫做这个数的机器数。(机器数对应补码形式)

        机器数是带符号的,在计算机用一个数的最高位存符号位,正数为0,负数为1

    • 真值(二进制最高位是符号位,要与形式值区分):(真值对应原码形式)

        因为第一位是符号位,所以机器数的形式值就不等于真正的数值。

        例如有符号数10000011,其最高位1代表负,其真正数值是-3,而不是形式值13110000011转换成十进制等于131

        所以为了区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。

        例:0000 0001的真值 = +000 0001 = +1 1000 0001的真值 = -000 0001 = -1

    2. 基本概念

    • 在探求为何机器要使用补码之前,让我们先了解原码,反码和补码的概念,对于一个数,计算机要使用一定的编码方式进行存储。
    • 原码、反码、补码是机器存储一个具体数字的编码方式。
    • 原码、反码、补码是计算机原理的术语,说白了就是为了理解计算机2进制用的。

    3. 数据的存储方法

      数据在计算机内部是以补码的形式储存的

      数据分为有符号数和无符号数,

        对于正数:补码 = 反码 = 原码

        对于负数:反码 = 原码 符号位不变,其余各个位取反

                    补码 = 反码+1

    原码:就是符号位加上其真值的绝对值,即用第一位表示符号,其余位表示值。

      因为第一位是符号位,所以8位二进制数的取值范围就是:

        [1111 1111,0111 1111] = [-2^8-1,2^8-1] = [-127,127];

        [1000 0000表示-128 ~ 0111 1111表示127] 一个字节(-128~127

    反码:

    如果是正数:正数的反码等于原码

    如果是负数:除符号位不变,其它位按位取反(1001

    补码:

    如果是正数:正数的补码等于原码

    如果是负数:在原码基础上符号位不变,其它各位取反,最后再+1

     

      (根据补码求原码:补码-1=反码,反码取反=原码;要根据原码求数值)

      对于负数,补码/反码表示方式人脑无法直接观看出其数值的。通常需要转换成原码再计算其数值。

    4. 数据(±1)在内存中存储细节:

    64位计算机上,int类型占用4个字节,每个字节8位;

        计算机存储±1要使用32位的二进制数码,存储的都是补码。

      

    5. 为什么要引入反码和补码?

    • 让计算机能够做减法
    • 减法的电路设计更简单

      减去一个正数等于是加上一个负数。机器可以只有加法而没有减法。

    如:用原码(反码)进行减法运算,1 – 1 = - 0

          用补码进行减法运算:1 – 1=1 +(-1)= 0

    位运算符

    位运算:用于整数的二进制位之间的运算。

         计算机是以其补码的形式存储数据,负数以补码形式表示为二进制数。位运算:是补码之间的运算!

      计算机里要根据原码去算十进制数值!!!

     

    • & 按位与】

      

    • | 按位或】

       

    • ~ 按位取反】

       

    • ^ 按位异或】

       

    • << 左移位】

      

    • >> 右移位】

       

     

  • 相关阅读:
    Java 异常
    【转】Java 内部类总结
    【转】Java中的static关键字解析
    【转】事务及事务隔离级别
    【转】事务并发的问题
    【转】hibernate对象三种状态
    iOS指南针
    CoreLocation 定位
    swift 2.2 语法 (下)
    swift 2.2 语法 (中)
  • 原文地址:https://www.cnblogs.com/bossren/p/6405520.html
Copyright © 2020-2023  润新知