一、认识进制
1、进制
计算机只认识二进制,也就是0和1。
计算机中存储的任何文件,接收的任何指令都是由0和1组成的。
进制的定义
八进制:八个符号组成,0、1、2、3、4、5、6、7,逢8进1
十六进制:十六个符号组成,0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F,逢16进1
2、 进制书写方式
列:
0 1 2 3 4 5 6 7 8 9 A B C D E F
这是十六进制的十六个数,如果想继续写15以后的数,就得进位,就好像9+1 = 10。
八进制没有八,十六进制没有十六,先用00占位,F后面没有数值,就进位看回了第一位。第一位0,产生进位 ,0往前看一位是1,所以十六用十六进制表示就是10。
从0000写道1111:
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
3、进制的运算
进制的本质就是找对应数值,每个进制都是一个独立体系,并不需要转换成其他形式做运算。
比如8进制:
2+3 =? 23= ? 45=?
277+333=? 27654=? 237-54=?234/4=?
计算:
2+3=5
23=找两个3,=6
4+5=在4后面数5个数,=11
4*5=4个5查,=24
乘除法:
编表
加法表:
1+1=2
1+2=3 2+2=4
1+3=4 2+3=5 3+3=6
1+4=5 2+4=6 3+4=7 4+4=10
1+5=6 2+5=7 3+5=10 4+5=11 5+5=12
1+6=7 2+6=10 3+6=11 4+6=12 5+6=13 6+6=14
1+7=10 2+7=11 3+7=12 4+7=13 5+7=14 6+7=15 7+7=16
乘法表:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=11
1*4=4 2*4=10 3*4=14 4*4=20
1*5=5 2*5=12 3*5=17 4*5=24 5*5=31
1*6=6 2*6=14 3*6=22 4*6=30 5*6=36 6*6=44
1*7=7 2*7=16 3*7=25 4*7=34 5*7=43 6*7=52 7*7=61
计算:277+333=?
7+3 找表=12,留2进1
7+3 找表=12,留2进1,因为第1步有一个1,所以留3进1
2+3 找表=5 , 进位+1=6
最后=632
计算:276*54=?
从乘法表里找,276*4 = 1370 276*5 = 1666
计算:234/4 = ?
看谁*4≈23,看到4*4=20,写4剩34
继续看表谁*4=34,是7,写0剩0
=47
二、数据宽度
1、数据宽度
计算机存储数据,不是无限制存储数据的。
如果存储的数据超过了所能接受的范围,就会选择抛弃一些数据来存储新的数据。就好比一个容器。
常见的单位有如下几个:
位 Bit 只存一位二进制
字节 Byte 可存储八位二进制0~FF
字 Word 可存储十六位二进制0~FFFF
双字 Dword 可存储三十二位二进制0~FFFFFFFF
一个字节所能存储的内容就是八位二进制
2. 数据溢出
如果超出存储范围,就会抛弃数据,默认抛弃左边的数据。
三、有无符号数
正数的计数规则和无符号数是一样的,二进制0是正数,1是负数。
原码
正数在内存中不管是说按原码、反码、补码存储都正确
列:0000 1011 最高位为0,是正数,其余位是多少,我就抄多少,所以还是0000 1011;
负数:1000 1011 最高位为1,是负数,其他位置存绝对值本身,也就是1000 1011
反码
负数:符号位为1,符号位不变,其余位置取反,1变0,0变1,也就是1111 0100
补码
负数:符号位为1,符号位不变,其余位置取反,取反完成后+1,也就是1111 0101
负数在内存中存储的方式是用补码的方式存储的
四、位运算
与运算
当两个数值都为1时,就为1
或运算
有一个数为1,就为1
异或运算
不一样的时候,为1
非运算
取反操作
左移(shl)
二进制左移若干位,高位丢弃,低位补0
列:左移两位
右移(shr/sar)
二进制右移若干位,低位丢弃,高位补0(unsigned),有符号补符号位
列:右移两位(无符号)
右移两位(有符号)