一切又回到了学习、总结、学习、总结模式,回顾了一下找工作期间遇到的很多问题,其实归根到底是因为基础不牢固,没有搞清楚其中的一些本质。就像前一章总结的浮点型运算一样,对于其他的数据类型都存在各种各样的难点,稍微不注意就会导致错误的产生。这些本质的东西本不应该现在来学习,但亡羊补牢为时不晚。
信息的编码方式
在计算机中信息都是以0、1两种数据来表示的,大家都知道,但是就是这两个简单的0、1如何实现了计算机的强大计算呢?这就涉及到了计算机中信息的表达和处理。在大学计算基础课上,开始就涉及了二进制、八进制、十进制、十六进制等进制之间的转换方式。其中二进制是计算机的实现方式,其他的进制都是出于一些目的定义的。在二进制中有三个基础概念:原码、反码、补码是非常重要的,很多人也对三者之间的转换方式非常清楚。
原码:对于十进制的数据,可以采用多个0、1构成的比特向量表示,其中最高位表示符号位,当为1时,表示这个数为负数,当为0时,表示这个数为正数。
反码:是指原码符号位除外的其他位进行取反操作,但是取反操作只针对负数,也就是说正数的原码等于反码。
补码:也只是针对负数而言,对于负数补码是指在反码的基础上加1即表示补码(但是不能改变符号位数据)。对于正数而言,补码等于反码,等于原码。
我们可以这样认为,为了解决负数的问题,在计算机中引入了反码、补码的概念,且补码、反码主要针对的对象就是负数,正数的补码、原码、反码是相同的bit向量。
在实际运用中补码相比另外两种编码方式更加的方便,因此对于有符号整形类型,几乎所有的编译器中都是采用补码方式进行编码,了解到编译器是采用补码的形式存储计算机的整形数据信息是非常重要的。
一般而言,对于有符号的整数型数据类型,即char、short、int这种类数据类型,都是采用补码方式编码的,但是对于无符号的整数型数据类型,一般都是采用原码的形式编码的,也就是单纯的比特向量,没有符号位之说,由于常用的计算机系统都是32bit,这也是为什么说计算机的地址空间是4G=2^32字节。char型数据类型占1字节的空间,而short类型一般占用2字节的空间,int型数据占用4个字节的空间。32个bit刚好占有4字节,因此我们可以认为int数据实际上就是一个32个bit向量。
由实际情况可知:
int型的范围是-2^31---2^31-1,可以认为是非对称的空间。无符号的unsigned int的范围则是0到2^32-1之间。
char型的范围是-128到-127之间,unsigned char的范围则是0到255之间,在很多的应用中可以充分运用char的范围减小存储量。
short的范围是-2^15到2^15-1,unsigned short 的范围是0-2^16-1。
需要了解的是有符号的整数型数据都是采用补码方式进行编码的,而无符号的数据类型一般采用原码方式编码(正数)。两种编码方式表示数据的范围存在差别,实际上在C语言编程的过程中都会进行