一、进制概念
二进制:数字由0、1组成;基数为2
- {C语言中不能直接表示}
八进制:数字由0~7组成;基数为8
- {C语言中以数字0开头表示八进制数}
十进制:数字由0~9组成;基数为10
- {C语言中以
1~9
开头表示的数}
十六进制:由数字0~9
和字母a~f
;其中字母不区分大小写;基数为16’
- {C语言中以
0x
开头的数表示十六进制数}
二、进制之间的转换
2.1 十进制转其他进制
整数部分使用除以进制基数取余数,反序排列;小数部分乘以进制基数取整数,顺序排列。
示例
将15,30,13.7分别转化为二进制,八进制,十六进制数。
15/2=7……1 15/8=1……7 15/16=0……15
7/2=3……1 1/8=0……1
3/2=1……1
1/2=0……1
15=1111B 15=17O 15=fH
30/2=15……0 30/8=3……6 30/16=2……8
15/2=7……1 3/8=0……3 2/16=0……2
7/2=3……1
3/2=1……1
1/2=0……1
30=11110B 30=36O 30=28H
13/2=6……1
6/2=3……0
3/2=1……1
1/2=0……1
0.7*2=1.4 取1剩下0.4
0.4*2=0.8 取0剩下0.8
0.8*2=1.6 取1剩下0.6
0.6*2=1.2 取1剩下0.2
0.2*2=0.4 取0剩下0.4
0.4*2=0.8 取0剩下0.8
0.8*2=1.6 取1剩下0.6
13.7=1101.10 1100 1100 1100……B
2.2 其他进制转化十进制
其他进制数的每一位上的数乘以进制基数的n次方然后在相加
n表示数的位数,从0开始计数。
示例:
分别将101100011B,23O,9afH表示为十进制数
101100011B=1*2^8+1*2^6+1*2^5+1*2+1=355
23O=2*8+3=19
9afH=9*16^2+10*16+15=2479
2.3 二进制转八进制、十六进制之间的转化
- 从右向左开始计数3个二进制数对应1个八进制数
- 4个二进制数对应1个十六进制数
- 数位不足时用0补齐数位。
示例:
将1001111000111B转化为八进制、十六进制数。
1 001 111 000 111=001 001 111 000 111=11707
1 0011 1100 0111=0001 0011 1100 0111=13C7
三、数在计算计中的存储
数在计算机中是以补码形式存储的
源码:是最简单的机器数表示法。可以直接得到原来数据的二进制码。符号用最高位表示符号位,‘1’表示负号,‘0’表示正号。其他位存放该数的二进制的绝对值。
补码:正数的补码等于源码;负数的补码模减去这个数的绝对值或源码符号位不变,数值位从右边数第一个1及其右边的0保持不变,左边安位取反。用于解决两个负数相加出错的问题
反码:正数的反码等于源码;负数的反码等于符号位不变,其它位取反。用于解决相反数相加不等于0的问题
补充
模:计数器的计数范围,如,八位有符号数的计数范围-128~127共256个数,模为256
求10011011000100的补码、反码。(最高位是符号位)
10011011000100=-1732
模为:16384
10011011000100[补码]=模-数的绝对值=16354-1732=14652=11100100111100
10011011000100[补码]={符号位不变}+{右边数第一个1及其右边的0保持不变}=11100100111100