【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; //在数值前面加上0b或0B就代表二进制

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—>16:4合1法。把一个二进制数,整数部分从右向左(小数部分从左向右)4位结合成1位,不足部分补0。

      

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

      

  2—>8:3合1

      

  8—>2:1拆3

  10—>8:除8取余

原码、反码、补码1. 机器数和真值

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

  

机器数(二进制数):

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

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

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

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

    例如有符号数10000011,其最高位1代表负,其真正数值是-3,而不是形式值131(10000011转换成十进制等于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)

反码:

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

如果是负数:除符号位不变,其它位按位取反(1变0;0变1)

补码:

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

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

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

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

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

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

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

  

5. 为什么要引入反码和补码?让计算机能够做减法减法的电路设计更简单

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

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

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

位运算符

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

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

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

【& 按位与】

  

【| 按位或】

  

【~ 按位取反】

  

【^ 按位异或】

  

【<< 左移位】

  

【>> 右移位】

  

发现一种久违的感动。

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

相关文章:

你感兴趣的文章:

标签云: