进制转换
1.明确:计算机中数字都是在内存中进行存储,并且这些数字都是以二进制的形式存储
2.明确:计算机软件代码中数字的表示形式(展现形式)有四种:
二进制表示,八进制表示,十进制表示,十六进制表示
注意:不管是哪种形式,都是对同一个内存中存储的数字的不同形式而已
内存中的数字不会因为表示形式不一样而发生改变
类比:人(数字)
在家(二进制形式)
在学校(八进制形式)
在公司(十进制形式)
在超市(十六进制形式)
人不管在哪里,本身是不改变的!
八进制,十进制,十六进制给程序看的,好看
二进制给计算机看,计算机只认二进制
3.明确:计算机把内存中每个字节又分8段,每段只能记录0和1
要想把一个数字存储到内存中,必须将这个数字分拆成若干个0和1存储到每个段中
所以:内存中的最小存储单元是位(bit)
结论:1Byte = 8bit
2Byte = 16bit
4Byte = 32bit
8Byte = 64bit
例如:
char a = 'A'; //分配1字节内存空间,把字符A的ASCII码65分拆成8个0和1(需要8位)存储到内存中即可
short a =250; //分配2字节内存空间,把250分拆成16个0和1(需要16位)存储到内存中即可
int a = 250; //分配4字节内存空间,把250分拆成32个0和1(需要32位)存储到内存中即可
4.二进制
a)定义:用一组0和1表示数字的方法简称二进制表示形式
例如:现在又一个十进制数85(前提是char类型),要存储到内存中,必须以二进制的形式存储
所以需要将85分拆成8个0和1,最终其二进制表示形式为:01010101(二进制形式)
b)特点:
1.二进制数的编号:从0开始
例如:前提是char类型
高位 低位
76543210 二进制数的编号
01010101 二进制数
例如:前提是short类型
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 二进制数编号
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 二进制数
2.二进制数中每个1单独代表一个10进制数字,这个10进制数字值是2的编号次方
例如:前提是char类型
高位 低位
76543210 二进制数编号
01000000 二进制数(其中第6位的1对应的10进制数字值是2的6次方 = 64)
3.二进制数中相邻的两个1,左边是右边的2倍
4.二进制数加1的时候把编号为0位置开始的多个连续的1变0,最左边的0变1(逢二进一)
例如:
76543210 二进制编号
00001111 + 1 = 00010000
00001110 + 1 = 00001111
----------------------------------------------------------------------------------------------
5.二进制和十进制之间的转换
问:10进制数85对应的2进制凭什么是01010101
2进制数01010101对应的10进制数凭什么是85
5.1.明确:计算机只认二进制,内存中只能存储数字的二进制形式
至于10进制,8进制,16进制都是对内存中2进制数的另外三种表示形式
5.2.二进制表示的非负数(0和正数)转换成10进制就是把每个二进制中的1单独转换10进制然后相加
得到最终的10进制值
例如:前提是char类型
76543210 编号
01010101 二进制数85(非负数)
85对应的10进制数 = 2的6次方+2的4次方+2的2次方+2的0次方 = 64+16+4+1=85
结论:将来存储85就是讲85分拆成8个0和1即:01010101,存储到1字节的内存空间即可
5.3.10进制表示的非负数转2进制(85->01010101)
采用"除2取余,逆序排列"法:用2整除十进制整数,可以得到一个商和余数
再用2去除商,优惠得到一个商和余数,如此进行
直到商为小于1时为止,然后把先得到的余数作为二进制数的地位,
后得到的余数作为二进制数的高位,依次排列起来。
例如:前提是char类型,91这个10进制数转2进制过程:
91/2=45 余1
45/2=22 余1
22/2=11 余0
11/2=5 余1
5/2=2 余1
2/2=1 余0
1/2=0 余1
结果二进制数为:0101 1011(高位补0,凑够1字节)
结论:将91分拆成0101 1011保存到1字节内存即可
前提是short类型,789(用char和unsigned char无法表示,太大了)
789/2=394 余1
394/2=197 余0
197/2=98 余1
98/2=49 余0
49/2=24 余1
24/2=12 余0
12/2=6 余0
6/2=3 余0
3/2=1 余1
1/2=0 余1
2进制数=0000 0011 0001 0101(short类型,16位,所以高6位补0,凑够2字节,16位)
5.4.负数的10进制和2进制不能直接转换,必须借助相反数(-5的相反数位5)
a)10进制的负数转2进制的步骤:
首先计算相反数,变成正数
然后将相反数转成2进制
最后取反加1得到10进制负数的2进制(取反的意思就是1变0,0变1)
例如:求-14(前提是数据类型是char)的二进制
1.计算-14的相反数为14
2.将14转成2进制:00001110
3.取反加1:11110001 +1 =11110010
结论:-14的2进制为11110010
b)明确:有符号类型数字(不加unsigned关键字修饰的)才能有符号
二进制数中最左边的位叫符号位,通过此位可以确定数字的符号位(正还是负,人为自己判断添加符号)
符号位的值为0表示数字为非负数(0和正数),符号位的值为1表示此数字为负数
切记:讨论符号位的前提是必须确定数据类型
例如:01010101(前提是char类型),此数必然是正数
10101000(前提是char类型),此数必然是负数
注意:10101000(前提是unsigned char类型),此数没有必要讨论正负,因为加了unsigned说明就是非负数
1000010110001000(前提是short类型),此数必然是负数
0000111110010000(前提是char类型),此数必然是负数,因为虽然是16位,但是char类型只能要8位
所以从低位开始要8位即可,最后的二进制是:10010000,此时最高位为1,表示负数
有了这个明确,现在就可以实现二进制表示的负数转十进制
例如:求二进制数10110110的10进制(前提是char类型,显然是负数)
1.先取反后加1:01001001 +1 = 01001010
2.然后将2进制转10进制:01001010 = 2的6次方+2的3次方+2的1次方=64+8+1=74
3.前提是已知这个2进制数为负数,所以最后求相反数:-74
结论:10110110的10进制数为-74
求:10101010二进制的10进制(char类型)
求:10101010二进制的10进制(short类型)
------------------------------------------------------------------------------------------------------------------------
6.2进制和8进制之间的转换
a)定义:就是把2进制数从右边到左边每3位分一组
每组用一个0到7的数字替换得到8进制表示形式
注意:八进制数前面加0(零)来表示,0250(说明这个数是一个8进制数)
占位符:0%o
例如:2进制数01101001(10进制是105)转8进制,三步骤:
1.先分组:01 101 001
2.换算:
01=2的0次方=1
101=2的2次方+2的0次方=5
001=2的0次方=1
3.替换得到:0151
结论:01101001的8进制数是0151
参考代码:bit.c 演练8进制的占位符
/*进制转换*/
#include <stdio.h>
int main(void){
int a = 105; //10进制数
//不管是10进制还是8进制,内存只存他们的2进制为:01101001
printf("a的十进制数是:%d,a的八进制数是:0%o\n",a,a);
int b = 0151; 8进制数
printf("b的十进制数是:%d,b的八进制数是0%o\n",b,b);
int c = 0xc3;
printf("c的十进制数是:%d,c的八进制数是:0%o,c的十六进制数是:%#x\n",c,c,c);
return 0;0
}
重磅好消息:实际开发2进制和10进制,2进制和8进制之间的转换记得用计算器!
---------------------------------------------------------------------------------------
7.2进制和16进制之间的转换(核心中的核心)
a)16进制定义:把2进制数从右边到左边每4位分为一组
每组用一个字符替换(用a到f之间的字母替换10~15之间的数字)
注意:16进制数前面需要添加0x或者0X,不区分大小写
占位符:%#x或者%#X
例如:11000011转换为16进制,分三步:
1.先分组:1100 0011
2.换算:
1100=2的3次方+2的2次方=8+4=12
0011=2的1次方+2的0次方=2+1=3
3.替换
12 -> c
3 -> 3
4.结果此二进制对应的16进制为:0xC3或者0Xc3或者0Xc3
b)切记:务必拿下2进制和16进制的转换(口算,不允许用计算器)
在程序中一般用16进制来表示2进制,16进制也就是2进制
结论:
16进制数 2进制
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101(常用)
6 0110
7 0111
8 1000
9 1001
10 1010(常用)
11 1011
12 1100
13 1101
14 1110
15 1111
演练:
高位 低位
0x48 0100 1000
0xb6 1011 0110
0xfac7621d 1111 1010 1100 0111 0110 0010 0001 1101
0xa596bef1 1010 0101 1001 0110 1011 1110 1111 0001
分析:
由于内存的每个字节只能存8位,所以讲0xa596bef1这个数据分成4个字节,每个字节8位
分别是:0xa5,0x96,0xbe,0xf1
对应的二进制分别是:
0xa5->10100101
0x96->10010110
0xbe->10111110
0xf1->11110001
然后将这些二进制分别存储到对应的内存中即可,从地位到高位
Q:250(数据类型为int类型)这个10进制数在内存中如何存储的?
A:思路:250->0x000000FA->0000 0000 0000 0000 0000 0000 1111 1010->4字节内存
Q:-250如何存呢?
A:-250->0xFFFFFF06->1111 1111 1111 1111 1111 1111 0000 0110(+1)->4字节内存