【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\n", num1); //%d是以十进制的方式输出一个整数

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

    

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

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

 

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

printf("%d\n", num3);

printf("%x\n", 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

位运算符

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

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

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

 

  • & 按位与】

  

  • | 按位或】

   

  • ~ 按位取反】

   

  • ^ 按位异或】

   

  • << 左移位】

  

  • >> 右移位】

   

 

posted @ 2017-02-13 14:20  专注·精彩  阅读(2222)  评论(0编辑  收藏  举报