计算机中信息的表示与处理
信息的编码方式
在计算机中信息都是以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语言编程的过程中都会进行隐式的强制类型转换,如果不清楚编码方式的差别,就很难准确的把握计算的差别。在嵌入式编程中经常会有一些简单的延迟操作,如果编写不恰当就会导致错误产生。如下所示:
void delay(int time)
{
unsigned char i = 0;
for(; time >= 0; -- time)
for(i = 0; i < 256; ++ i)
;
}
这个题乍一看没什么问题,但是仔细推敲就会发现存在问题,因为存在死循环,unsigned char的最大值是255,不可能大于等于256,因此一直满足条件,也就是说第二个循环会一直执行,这就是典型的不注意范围问题。
还有一个典型的排序问题:
unsigned char array[1000][1000];
void sort(unsigned char (*a)[1000])
{}
这种属于典型的大数排序问题,只有选择合适的排序策略才能减少排序的时间复杂度,那么如何实现呢?最简单的方式是采用计数排序,时间复杂度为O(n)。充分利用了unsigned char的数值范围在0-255之间这个范围。
左移右移处理
在整形数据类型中有一个问题就是典型的移位操作,在机器语言中也会有位操作,在C语言中也存在位操作,这为直接控制CPU提供了较好的实现方式。移位主要包含左移和右移操作,其中左移的实现是在当前数据的bit向量向左移动n个bit,后续的bit补0。
而右移比左移复杂一些,右移存在两种:逻辑右移和算术右移,逻辑右移主要是针对无符号型数据,逻辑右移是指将当前的bit向量向右移动,左边bits补零。算术右移主要针对有符号型数据,将当前数据右移,左边补上最高bit的值。这种实现方式能够保证数据的符号不改变,也就是说负数通过右移以后还是负数,不会变成正数。而逻辑右移则不行,负数通过逻辑右移以后就变成了正数,这是不合理的。因此可以总结如下:
对于左移操作,不管是有符号还是无符号类型,都是右端直接补零。这时候可能导致数据发生较大的变化,正数通过左移变成了负数,出现这些的原因实际上是左移操作忽略了进位操作,正负都是合理的。在整形数据中经常采用左移操作实现数据的乘法操作,两个正数相乘是有可能产生负数的。比如:
计算机信息表示与处 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)
