4.1.明确:计算机中数字都是在内存中,并且数字都是以二进制的形式存储
4.2.明确:计算机中对数字的表示形式有四种:
2进制表示,8进制表示,10进制表示,16进制表示
不管是哪种形式,都是对同一个内存中存储的数字的不同表示形式而已
也就是内存的中的数字不会随着进制的不同而改变!
8,10,16进制给程序员看,好看
2进制给计算机看,计算机只认2进制
4.3.明确:计算机中把内存中每个字节又分8段,每段只能记录0和1
要想把一个数字存储到内存中,必须将这个数字分拆成若干个0和1
每段对应的专业术语:位,bit,bit位
结论:1Byte=8bit
2Byte=16bit
4Byte=32bit
8Byte=64bit
例如:char a = 'a'; //需要1个字节,8位就可以存97
short b = 2500; //需要2字节,16位就可以2500
int c = 2500000000000; //需要4字节,32位就可以存
4.4.二进制
切记切记切记:计算机中所有的数字都是以二进制的形式存储到内存中
a)定义:用一组0和1表示数字的方法简称二进制表示形式
例如:现在有一个10进制数90(前提是char类型),要存储到内存中,必须以二进制来存
需要将90分拆成8位,其二进制表示形式为:01011101(二进制形式)
b)特点:
1.二进制数的编号:从0开始
例如:前提是char类型
高位 低位
76543210 二进制数的编号
01011010 二进制数
例如:前提是short类型
高位 低位
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 二进制数的编号
0 1 1 1 0 1 1 0 0 0 0 1 1 0 0 1 二进制数
2.二进制数中每个1单独代表一个10进制数字,这个数字的值是2的编号次方
例如:前提是char类型
高位 低位
76543210 二进制数的编号
01000000 二进制数A(其中第6位的1对应的数字为2的6次方=64)
3.二进制数中相邻的两个1,左边是右边的2倍
4.二进制数加1的时候把编号为0位置开始的多个连续的1变成0,最左边的0变1
例如:
76543210 二进制数的编号
00001111 + 1 = 00010000
01111110 + 1 = 01111111
4.5.二进制和十进制之间的转换
a)明确:计算机中所有的数字都是以二进制的形式存储到内存中
而这个10进制就是对内存中的二进制数的另一个表达方式而已,不会改变原来的数
b)二进制表示的非负数(0和正数)转换成10进制就是把每个二进制数中的1单独换算然后加
例如:前提是char类型
76543210 二进制数的编号
01101010 二进制数A(非负数)
A对应的十进制数B=2的6次方+2的5次方+2的3次方+2的1次方=64+32+8+2=106
结论:将来把106十进制数分拆8位,一位一位的存到1字节的内存中
c)10进制表示的非负数转2进制
采用"除2取余,逆序排列"法
具体做法是:用2整除十进制整数,可以得到一个商和余数;
再用2去除商,又会得到一个商和余数,如此进行,直到商为小于1时为止,
然后把先得到的余数作为二进制数的低位
后得到的余数作为二进制数的高位,依次排列起来。
例如:91这个十进制数转成对应的二进制
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
结果二进制为:01011011
789/2=394 余1 第0位
394/2=197 余0 第1位
197/2=98 余1 第2位
98/2=49 余0 第3位
49/2=24 余1 第4位
24/2=12 余0 第5位
12/2=6 余0 第6位
6/2=3 余0 第7位
3/2=1 余1 第8位
1/2=0 余1 第9位
789的二进制数:000001100010101(用2个字节来存储,高5位补0)
d)负数的十进制和二进制不能直接转换,必须借助相反数(5的相反数-5)
1.十进制的负数转二进制三步骤:
首先计算相反数
然后将相反数转成二进制
最后取反加1(取反的意思就是1变0,0变1)
例如:-14(10进制的负数,前提是数据类型为char)
1.计算-14的相反数14
2.将14转换成二进制:00001110
3.取反加1:11110001+1=11110010
结论:-14将来在内存中对应的二进制数为11110010
2.明确:有符号类型数字(不加unsigned)才能有符号
二进制数中最左边的位叫做符号位
此位可以确定数字的符号(正还是负)
符号位的值为0表示此数字为非负数(0和正数)
符号位的值为1表示此数字为负数
切记:讨论符号位的前提是必须确定数据类型
例如:10010101(前提是这个二进制数的数据类型为char),此数必然是负数
00010101(前提是这个二进制数的数据类型为char),此数必然是正数
1001010110010101(前提是这个二进制数的数据类型为short),此数必然是负数
0001010110010101(前提是这个二进制数的数据类型为short),此数必然是正数
0000000010010101(前提是这个二进制数的数据类型为char),此数必然是负数
例如:换算二进制数10110110的十进制(前提是数据类型为char,显然为负数)
1.先取反加1:01001001+1=01001010
2.然后将二进制转十进制:01001010=2的6次方+2的3次方+2的1次方=64+8+2=74
3.最后取相反数:-74
4.6.二进制(0/1)和八进制(0~7)之间的转换
a)明确:计算机中所有的数字都是以二进制的形式存储到内存中
而这个8进制就是对内存中的二进制数的另一个表达方式而已,不会改变原来的数
b)八进制定义:就是把二进制数从右边到左边每三位分一组
每组用一个0到7的数字替换得到八进制表示形式
注意:八进制数前面加0(零)
占位符:0%o
例如:二进制数:0110 1001(十进制为105),转八进制,三步骤:
1.先分组:001 101 001
2.换算:
001=2的0次方=1
101=2的2次方+2的0次方=5
001=2的0次方=1
3.替换:0151
重磅好消息:二进制,十进制,八进制之间的转换实际开发记得用计算器!
4.7.二进制(0/1)和十六进制(0~f)之间的转换(核心中的核心)
a)明确:计算机中所有的数字都是以二进制的形式存储到内存中
而这个16进制就是对内存中的二进制数的另一个表达方式而已,不会改变原来的数
b)十六进制定义:把二进制数从右边到左边每四位分为一组
每组用一个字符替换(用a到f之间的字母替换10~15之间的数字)
注意:16进制数前面加0x或者0X,不用区分大小写
占位符:%#x或者%#X
例如:11000011(二进制),转成对应的16进制数,分三步:
1.先分组:1100 0011
2.换算:
1100=2的3次方+2的2次方=12
0011=2的1次方+2的0次方=3
3.替换
12->c
3->3
4.结果:此二进制对应的十六进制为:0xC3
4.8.切记切记切记:务必拿下二进制和十六进制之间的转换
二进制在程序中一般用16进制表示,16进制也就是二进制
严重鄙视用计算器实现2进制和16进制的转换,必须立马脑子换算出来!
结论:
16进制 2进制
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101(用的多)
6 0110
7 0111
8 1000
9 1001
a 1010(用的多)
b 1011
c 1100
d 1101
e 1110
f 1111
演练: 高 低
0x48 0100 1000
0xb6 1011 0110
高 低
0xfacb6321 1111 1010 1100 1011 0110 0011 0010 0001
0x5a48cd17 0101 1010 0100 1000 1100 1101 0001 0111