【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
位运算符
位运算:用于整数的二进制位之间的运算。
计算机是以其补码的形式存储数据,负数以补码形式表示为二进制数。位运算:是补码之间的运算!
计算机里要根据原码去算十进制数值!!!
- 【& 按位与】
- 【| 按位或】
- 【~ 按位取反】
- 【^ 按位异或】
- 【<< 左移位】
- 【>> 右移位】