前言
笔记汇总,进制的相互转换及原码、反码、补码的数据表示
目录
0.进制的概念
计算机采用二进制形式存储数据
二进制:由0和1两个符号组成,逢2进一
十进制:由0到9共10个符号组成,逢十进一
八进制:由0到7共8个符号组成,逢八进一
十六进制:十六个符号组成,分别是0,1,2,3,4,5,6,7,8,9,,A,B,C,D,E,F。逢十六进一
N进制的定义:由N个符号组成,逢N进一
计算机为什么采用二进制?
计算机是由许多电路组成,电路只有两种状态
1.进制计算
(1).查表法
(2).短除法
定义:当一个M进制数转N进制数时,就是用这个数除N取余,逆序排列。
具体做法:将N作为除数,用M进制整数除以N,可以得到一个商和余数;保留余数,用商继续除以N,又得到一个新的商和余数;仍然保留余数,用商继续除以N,还会得到一个新的商和余数;如此反复进行,每次都保留余数,用商接着除以N,直到商为0时为止
例:
十进制转二进制、八进制、十六进制
(1)1010--->x2
结果为1010--->10102
(2)10010--->x8
结果为10010--->1448 。
(3)10010--->x16
结果为10010--->6416
注:用短除法可以进行任意进制的相互转换
注:短除法特别适合十进制向二、八、十六进制的转换
(3).位权相加法
M进制转为N进制时要进行这样的运算:a*N(i-1)+aN(i-2)+...+a*N+a
例:
- 二进制转十进制
转换公式:a*2(i-1)+a*2(i-2)+...+a*2+a
例:110012=1*24+1*23+0*22+0*21+1*20=(16+8+0+0+1)10=2510 - 八进制转十进制
转换公式:a*8(i-1)+a*8(i-2)+...+a*8+a
例:1458=1*82+4*81+5*80=(64+32+5)10=10110 - 十六进制转十进制
转换公式:a*16(i-1)+a*16(i-2)+...+a*16+a
例:14516=1*162+4*161+5*160=(256+64+5)10=32510 - 二进制转八进制
3位二进制数正好是一位八进制数、
从低到高,按3位一组编组,高位不够3位补0,在编组内用二进制转十进制的公式
例:110012=(011)2( 001)2=(0*22+1*21+1*20)(0*22+0*21+1*20)=318
- 二进制转十六进制
4位二进制数正好是一位十六进制数
从低到高,按4位一组编组,高位不够4位补0,在编组内用二进制转十进制的公式
例:110012=(0001)16( 1001)16=(0*23+0*22++0*21+1*20) (1*23+0*22++0*21+1*20)=1916
位权相加法特别适合二、八、十六进制转十进制
(4).拆位拼接法
一位八进制数等于3位二进制数,一位十六进制数等于4位二进制数
- 八进制转二进制
一位八进制数通过查表拆成三位二进制,然后按八进制数的高低位组合起来即可。如:
27438---->x2
先拆成:2 7 4 3,然后分别查表对应的二进制 010 111 100 011
然后拼接,结果为(27438---->0101111000112 - 十六进制转二进制
一位十六进制数通过查表拆成四位二进制,然后按十六进制数的高低位组合起来即可。如:
A5D616---->x2
先拆成:A 5 D 6,然后分别查表对应的二进制 1010 0101 1101 0110
然后拼接,结果为A5D616---->10100101110101102
(5).借桥法
对某些困难的情况,我们可以先转位十进制或二进制,然后在转为对应的进制,我成为借桥法,中间的进制就是桥。比如十六进制转八进制,我们可以先用位权相加法转为十进制,在用短除法转为八进制。
(6).总结
- 短除法和位权相加法都能进行这四种进制的相互转换,只是在某些情况下较困难
- 十进制转二、八、十六进制时最好用短除法
- 二、八、十六进制转十进制时最好用位权相加法
- 二进制转八、十六进制最好用合位法和位权相加法
- 八、十六进制二转进制最好用拆位拼接法
- 八进制和十六进制的互相转换最好用用借桥法
2.有符号数和无符号数
无符号数全代表正数,有符号数表示有正数和负数之分
(1).无符号数
无符号数(unsigned number) 是相对于有符号数而言的,
指的是整个机器字长的全部二进制位均表示数值位,相当于数的绝对值。
无符号数32位的取值范围是: 0~4294967295
注意:%u 无符号32位整数
(2).有符号数
有符号数(signed number) 和无符号数基本相同,不同的是:一般用最高有效位(MSB)来表示数的符号,正数用0表示,负数用1表示。
有符号数32位的取值范围是: -2147483648~2147483647
在有符号数中,最高位所代表的值是- 2^ 31 ,而不是-1
注意:%d 有符号32位整数
(3). 有符号数和无符号数的区别
有符号数和无符号数的区别:
在32位编译器中,有符号数的二进制位最高位表示-2^ 31,而无符号数的二进制位最高位表示的是2^31
无论它是有符号数还是无符号数,它的二进制表示肯定都是唯一的
(不可能在有符号形式下有一种表示,在无符号形式下也有一种表示)
3. 原码、反码、补码和移码
(1). 背景
负数表示问题:
在数学中,任意基数的负数都在最前面加上“−”符号来表示。
在计算机硬件中,数字都以无符号的二进制形式表示。
但是负数如何用二进制表示呢?
解决:
通过:原码、反码、补码,用于扩展二进制数字系统,来表示有符号数。
(2). 原码、反码、补码和移码
a.什么是机器数?
机器数就是 数在计算机中的二进制表示形式。
机器数是带符号的,在计算机中用二进制数的最高位存放符号, 正数为0, 负数为1。
例如:
计算机字长为8位,则:
十进制数+3 ,转换成二进制00000011,
十进制数-3 ,转换成二进制10000011。
那么,这里的00000011和10000011就是机器数。
b.什么是真值?
真值就是真正的值。
因为二进制数的最高位是符号位,所以机器数的形式值就不等于真正的数值。
为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。
即第一位用±表示数字的正负,其余为二进制数。
例如:
0000 0001的真值= +000 0001,1000 0001的真值= –000 0001。
c.原码、反码、补码和移码
原码:就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。
例如:
1 的源码 0000...0001 -1的原码:1,000...0001
反码:正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反
例如: 1的反码还是1 -1的补码为1,111...1110
补码:正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1
例如:1的补码还是1 -1的补码为1,111...111
(这就解释了无符号-1 = 1111…1111 = 4294967295)
因为: 在有符号数中,最高位所代表的值是 - 231 ,而不是 -1
注:补码的补码等于原码!
移码:表示浮点数的阶码
[X]移 = 2(n-1) + X,其中-2(n-1)<X<2(n-1)
0只有一个移码,符号为1,其余为0
范围:-128~+127
正数:原码符号位变反
负数:原码同符号位一起变反,再加1
补码和移码符号位相反,数值位相同
d. -1 和 0xFFFFFFFF问题
有符号 -1 的二进制表示就是以补码形式表示,即: 0xffffffff
unsigned (-1)表示无符号整数的最大值 即: 4294967295(二进制全1)
因此,unsigned(-1)=1,111…111(共32个1)。表示unsigned的最大值。也就是0xFFFFFFFF
数据的宽度为容器的大小,它的位数代表能存储多少位的二进制数
数据溢出:所有的容器都是有一定的存储范围的,一且超出存储范围,它就会从低位到高位存储,多的含弃。