C语言学习随笔-01 关于二进制
1、二进制数据是用0和1两个数码来表示的数,它们的基数为2,进位规则是逢二进一,借位规则是借一当二。
2、当今的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的,计算机中的二进制则是一个非常微小的开关。
3、进制转换
▶ 二进制(B)、八进制(O)、十进制(D)、十六进制(H)
● 3.1 二进制(B)转八进制(0)
方法1:三位数为一组,不够前面补0,按权展开法计算。
例:10110(B)= 26(O)
(0*22+1*21+0*20)+(1*22+1*21+0*20)=26(O)
方法2:(421法):将每组的数分别对应421,0对应的数不要,1对应的数相加,把每组数的和连起来即可得到八进制数。
0 1 0 1 1 0 = 26(O)
4 2 1 4 2 1
● 3.2 二进制(B)转十进制(D)
方法1:(按权展开式):把二进制每位数乘上2的位权,数字位权从0开始,从右往左,依次加1,把结果相加即可得到十进制数。
例:10110(B)= 22(D)
1*24+0*23+1*22+1*21+0*20 = 16+0+4+2+0 = 22(D)
方法2:二进制数从右往左依次对应1、2、4、8、16、32...,0对应的数不要,1对应的数相加。
例:10110(B) = 22(D)
1 0 1 1 0
16 8 4 2 1
● 3.3 二进制(B)转十六进制(H)
方法:(8421法):每四个数为一组,不够四位在前面补0,每组数按权展开,分别对应8421,0对应的不要,1对应的相加,把每组数的和连起来即可得到十六进制数。
例:101101(B) = 2D(H)
0 0 1 0 1 1 0 1 = 2D(H) D = 13
8 4 2 1 8 4 2 1
● 3.4 十进制(D)转二进制(B)
方法:(短除法):除二取余,倒序排列。
例:26(D) = 11010(B)
2 26 0
2 13 1
2 6 0
2 3 1
1 1
● 3.5 八进制(O)转二进制(B)
方法:(421法):把八进制数每位拆开分别对应421,能对应上的写1,对应不上的写0,不够三位前面补0。
例:26(O) = 10110(B)
4 2 1 4 2 1 = 10110(B)
0 1 0 1 1 0
● 3.6 十六进制(H)转二进制(B)
方法1:(短除法):把十六进制每一位数分别除2取余,然后倒序排列,余数需凑后四位二进制数,不够的在前面补0.
例:5C2(H) = 010111000010(B)
2 5 1 2 12 0 2 2 0
2 2 0 2 6 0 1 1
2 1 1 2 3 1
1 1
方法2:(8421法):把每位数拆开分别对应8421,需要的值为1,不需要的值为0。
例:5C2(H) = 010111000010(B)
5拆分成为4和1,C拆分成为8和4,2不拆分
8 4 2 1 8 4 2 1 8 4 2 1
0 1 0 1 1 1 0 0 0 0 1 0
● 3.6 十进制(D)转八进制(O)
方法:除8取余,倒序排列。
例:59(D)= 73(O)
8 59 3
7 7
● 3.7 八进制(O)转十进制(D)
方法:(按权展开法):每位八进制数分别乘以8的位权次幂,把和相加即可得到十进制数。
例:123(O) = 83(D)
1*82+2*81+3*80 = 64+16+3 = 83(D)
● 3.8 十进制(D)转十六进制(H)
方法:除16取余,倒序排列.
例:43(D) = 2B(H) B=11
16 43 11
2 2
● 3.9 十六进制(H)转十进制(D)
方法:(按权展开式):十六进制每位数分别乘以16的位权次幂。
例:2B(H) = 43(D)
2*161+11*160 = 32 + 11 = 43(D)
4、小数部分的进制转换
● 4.1 二进制小数转十进制小数
方法1:整数部分使用按权展开法,小数部分按权展开法从左往右依次为-1、-2、-3...
例:11.101(B) = 3.625(D)
1*21+1*20 = 2 + 1 = 3 + 1*2-1+0*2-2+1*2-3= 0.5+0+0.125=0.625 = 3.625(D)
方法2:可以用小数部分从左往右依次除以2/4/6/8/16...
1/2+1/8 = 0.5+0.125 = 0.625
● 4.2 二进制小数转八进制小数
方法:(421法):整数部分每三位一组,不够前面补0,从右到左,分别对应421,0对应的不要,1对应的相加;小数部分三位一组,不够后面补0,从左往右。
例:11.101(B) = 3.5(O)
0 1 1 . 1 0 1 = 3.5(O)
4 2 1 . 4 2 1
● 4.3 二进制小数转十六进制小数
方法:(8421法):二进制数每四位一组,整数前面补0,小数后面补0,依次对应8421,0对应的不要,1对应的相加。
例:11.101(B) = 3.A(H)
0 0 1 1 . 1 0 1 0 = 3.A(H) A=10
8 4 2 1 . 8 4 2 1
● 4.4 十进制小数转二进制小数
方法:整数部分:除2取余,倒序排列;小数部分:乘2取整,正向排列。
例:3.625(D) = 11.101(B)
2 3 1 . 0.625
1 1 x 2 = 11+0.101 = 11.101(B)
1.250
x 2
0.5
x 2
1
5、二进制原码、反码以及补码的转换方式
因为计算机的计算器中只有加法器,所以需要将减法转换为加法来计算。
● 原码:是一个数的二进制表现形式,二进制首位为标志位(标志位为0表示为正数,标志位为1表示为负数)。
例:14(D) = 00001110(B)
-21(D) = 10010101(B)
● 反码:正数的原码、反码和补码都相同,为原码本身,所以14(D)的反码和补码都是 00001110。
负数原码转反码:标志位不变,其他取反;补码则在反码的基础上加1。
例:如-21(D):10010101->反码为:11101010->补码为:11101010+1 = 11101011。
计算机内的计算方式:补码+补码返回结果的原码,然后输出原码的十进制数。
例:14+(-21) = -7
14的补码为:00001110
-21的补码为:11101011
00001110
+ 11101011
11111001 (-7的补码)
- 1
11111000 (-7的反码)
10000111 (-7的原码)
-7 (输出十进制结果)
例:14-(-21) = 35
00001110
+ 00010101
00100011
35
6、知识点补充:
▶ 8位二进制数能表示的十进制数的范围为-128到+127。
▶ 如果数小于-128或大于127,则会溢出,溢出只能用两个字节,用16位的二进制数表示。
▶ 0的补码为00000000,-128的补码为10000000。
▶ 计算机中有符号的数用补码表示。
▶ 原码首位为标志位,1表示负数,0表示正数。
▶ 反码=原码的标志位不变,其他取反。
▶ 补码=反码+1。
▶ 正整数的原码、反码可补码相同,为原码本身。

浙公网安备 33010602011771号