1.数据的存储
1.二进制
1.二进制介绍
生活中我们常听到二进制,八进制,十进制,十六进制这样的讲法,具体是什么意思呢?其实二进制,八进制,十进制,十六进制是数值的不同表现形式而已
例如15的不同表示形式
接下来我们根据生十进制引出二进制的概念
十进制作为生活中最熟悉的数值表现形式,具有以下特征:
1.十进制中满10进1
2.十进制数字的每一位都是由0-9组成的
同理,二进制具有以下的特征:
1.二进制中满2进1
2.二进制数字的每一位都是由0-1组成的
例如1101就可以代表一个二进制数字
2.二进制和十进制的转化
十进制中123表示的值是一百二十三,但为什么是这个值呢?其实十进制的每一位都是有权重的,十进制从右向左依次是个位,十位,百位......,其权重依次是10^0,10^1,10^2......,如下图
二进制和十进制是类似的,只不过二进制每一位的权重,从右向左依次是2^0,2^1,2^2......,如果是二进制的1101该怎么理解呢?
从上图中我们了解了二进制转化为十进制,那么如何将十进制转化为二进制呢?
在十进制中我们通过n=n%10得到n的最后一位,在通过n=n/10一直循环直到n==0便可以得到n的每一位,二进制也是同样的道理
3.二进制转八进制
不难发现八进制的一个位是0~7的,一共有八种情况,相当于二进制的三个位(也有八种情况),因此二进制转八进制可以从二进制的右边低位开始向左取三个位转化为一个八进制位(若位数不够可以在最前面补0)
4.二进制转十六进制
同理十六进制的一个位是0~f的(a用来代表十进制的10,b用来代表十进制的11......f用来代表十进制的15),相当于二进制的四个位,因此二进制转十六进制可以从二进制的右边低位开始向左取四位转化为一个十六进制位(若位数不够可以在最前面补0)
2.原码,反码和补码
1.整数的二进制表示方法有三种,即原码,反码和补码
有符号整数的三种表示方法分为符号位和数值位两部分,二进制序列中,最高位的1位被当作符号位,剩余都是数值位
符号位用0表示正,1表示负
2.正数的原码,反码和补码都相同。
负数的三种表示方式各不相同
原码:直接将数值按照正负数的形式翻译成二进制的就是原码
反码:原码符号位不变,其他位按位取反得到的就是反码
补码:反码+1得到的就是补码
3.对于整型来说,数据存放在内存中的其实是补码
理由:
下图能更好的理解三者的关系
当我们以有符号整型%d打印时,补码的第一位是符号位,最后打印出来-1(注意printf打印出来的数字是原码)
当我们以无符号整型%u打印时,补码的第一位不是符号位,最后打印出来的数字就是补码(正数的原码和补码一样)的二进制数字转化而来的十进制数字
2.相关操作符
1.移位操作符
1.左移操作符<<
移位规则:左边抛弃,右边补0
2.右移操作符>>
移位规则:左边用该值的符号位填充,右边丢弃
2.位操作符
1.按位与&
两个数的二进制序列每一位当且仅当都为1时结果为1,反之为0
2.按位或|
两个数的二进制序列每一位至少有一个为1时结果为1,反之为0
3.按位异或^
两个数的二进制序列每一位相同时结果为0,反之为1
4.按位取反~
将一个数的二进制序列中的0变为1,1变为0