第2章 揭开数据表示的面纱
计算机可以用来办公、娱乐、上网、辅助教学。但是归根结底做的事情只有一件,那就是计算。
对于一个X进制的系统中,其第n位数字的权值就是X的n-1次方。
C/C++的位操作符有6个。&按位与 |按位或 ^按位异或 ~按位取反 <<左移 >>右移
使用与操作某些位置0 使用或操作某些位置1 使用异或操作某些位反转。~的运算符优先级要比其他运算符优先级要高。对于有符号数,大多数C语言编译器会采用算术右移,而不是逻辑右移。但也有例外。
符号-幅值表示法造成0的两种表现形式00000000和10000000。所以2的补码表示法克服这一缺点01111111代表127 ,10000000代表-128,10000001代表-127,11111111代表-1。
浮点表示法和定点表示法的最大区别在于它的小数点是非固定的。一个整数值乘以2,就相当于它的二进制形式向左移动1位。当1个浮点数乘以2时,就相当于它的指数加1!32位的单精度和64位的双精度,它们的指数字段分别是8为和11位。对于32位单精度来讲,1位符号位,8位指数位,23位有效数。指数位为偏值的,表示-127到128.
float就是32为单精度的,double为双精度的。double为1位符号为,11位指数位,52位有效位。
简单的二进制之所以能够被计算机识别并加区分,是因为计算机定义了一种编码方式,并通过各种编码方式来规定各种类型数值如何被表示。
ASCII码适用于所有拉丁文字,它用7位二进制数进行编码,可以表示128个字符;第0-32号及第127号(共34个)是控制字符或通信专用字符。如LF(换行)----0x0a ‘\n’ ,CR(回车)----0x0d '\r' ,FF(换页),DEL(删除)----0x7F ,BELL(振铃)-----0x07 ‘\a’ 。
奇校验规定 如果一个字节的编码序列中1个个数如果是奇数,那么校验位就置1;如果序列中1的个数是偶数,那么校验位就置0。偶校验规则刚好与其他相反。ASCII的最高位没用上,所以有了ASCII扩展码,值为128-255。扩展码用以存放英文的制表符、部分音标字符及其他符号。
对于汉子编码方式规定:对于连续的两个字节,只有在两个字节的第7位都是1的情况下,才认为两个字节合起来表示一个汉子。GB2312包含了6000多个汉字,此外还收录了常见的数学符号、罗马和希腊的字母、日文的假名等。GB2312还为原来在ASCII码里的数字、标点、字母重新编排了一个有两个字节长的编码(这就是常说的“全角”字符,而原来的ASCII吗就叫做“半角”字符。)GB2312后来又扩展成GBK(国标扩展码)、甚至GB18030.此外,不同的国家和地区都制订了不同的编码标准,如BIG5,JIS等编码。不同的编码互不兼容,当信息在国际间交流时,无法将属于两种语言的文字存储在同一段编码的文本中,Unicode由此浮出水面。
Unicode对各种语言中每一个字符设定了统一并且唯一的数字编号,以满足跨语言、跨平台进行文本转换处理的要求。GBK码与Unicode码之间转换通过查表来完成。
C语言的数据类型为4钟 基本类型(整形 字符型 浮点型 枚举型)、指针类型、构造类型(数组型、结构体型、共有体型)、空类型。
理解数据的存储形式和存在状态是理解计算机系统的重要一步。
C语言标准中并没有规定各种不同的整形数据在内存中所占的字节数,而只是简单地要求长整型数据的长度应不短于基本整形,而短整型数据的长度要不长于基本整形即可。因此不同的编译器和计算机系统中的具体实现形式也不统一。
因为浮点数在计算机内表示的是近似值。比如1.2的浮点数表示为1.20000004768372。因为要永远不要比较两个浮点数是否相等。这儿不是说大于和小于奥。可以用函数完成近似相等。