学习C++的一个关键是要理解计算机中数据的存储方式。众所周知,计算机采用二进制进行数据的存储与运算,本篇就围绕二进制数的转换,存储,运算进行展开。
1.什么是二进制?
通常人们所熟悉的和使用的是十进制,即使用0~9表示数据,逢十进一。类比之下,二进制就是0和1表示数据,逢二进一。除此之外常见得还有八进制(0开头)与十六进制(0X开头)。
二进制表示数据具有以下优点:
a.便于物理表达:只有两种状态,在物理上表达为通电或者断电,这也是早期电子管计算机运作的基本原理。
b.运算简单:根据排列组合,对于R进制,对于求和与求积,按照运算数的组合分别有R(R+1)/2种。对于二进制则是有三种。
缺点:占据数位较多,容量较小。
2.进制转换
a.二进制转十进制
类似的八进制或者十六进制转化为十进制也是按位幂运算求和。
b.十进制转二进制
俗称除二取余法
每次取余数,然后从低位写到高位(1000100)=68.八进制与十六进制也是如此。
以上是整数,当存在小数时,则不再是相除,而是相乘 (乘二取整法):
所以
因此结合整数部分可知:
3.信息的存储
位(bit):即0或者1占据的位置,表示1位二进制;
字节(byte):8位为1byte,信息存储基本单位;
C++中的数据类型往往都是byte的整数倍,例如sizeof(int)就是4byte;
4.原码,反码与补码
以8位二进制数为例:只有右边七位表示数值,最左边一位表示符号(0为正1为负):
A:+1011011 B:-1011011
正数的原码,反码一样,补码为反码+1,因此不讨论,重点讨论负数的 :
原码:首位表示符号,后边表示无符号的数值;
反码:符号位不变,后边按位取反;
补码:反码最小位+1;
原码=补码+1;
由于补码具有良好的运算性质,数据一般都存储为补码