[置顶] 成为C++高手之轻松理解二进制

计算机中所有的数据都是用0和1表示的,因为计算机根本表示不出除0和1之外的其它值。但实际上我看们看到计算机中不但能表示各种各样的数值,还能表示文本,表示图像、视频、音乐等。而且除了表示数据还能表示指令,不同的指令组织到一起就是一段程序。

那么计算机内是如何表示这些不同的数据和指令的呢?很简单:编号。拿指令来说,计算机有很多指令,比如加法:ADD;跳转:JUMP等等,怎么区分不同的指令呢? 就是给它们编号呗,编号就是用数嘛,所以如果你去看一个运行的程序的指令,看到的就是数。

再比如文字。每个汉字或每个字母叫做一个字符。比如“人、4、t”。字符的显示其实是计算机把字符的图像画出来的过程。字符的图像提前制作好放在一个表中,要找到字符对应的图像,就得先对字符进行编号,这个编号跟其图像在表中的位置一样,于是跟据字符编号就找了它的图像。其实在内存中,字符就是直接用编号表示的,所以还是一个数。我们都听说过ASC码,就是对256个常用字符进行了编号。代表字符的char型就是一个8位的整数。存放字符图像的表,不就是字体文件吗?

当然其它的东西也是数啊,比如图像是由像素组成的,而每个像素就是一个颜色,颜色是由数表示的,如果是RGB表示的颜色,其每通道占8个字节,一个像素就是由3个字节组成的数表示。

所以计算机技术又叫数字化技术。

那么数据是数,指令也是数,它们之间怎么进行区分呢 ? 你可以发挥一下像想力:把某块内存区指定成代码区,把另一块内存区指定成数据区,那么代码区和数据区的内容虽然看起来都是数,但是计算机却知道代码区的数对应着指令,是指令的编号,是可以执行的,而数据区的数是不可以执行的。

然而,计算机只能表示0和1,但指令有几百个呢,编号的话要编到好几百,字符有几万个呢,要能表示到几万才行,而十亿美元,这个十亿这个数怎么表示呢?

很简单,一个存储单元只能表示0或1吧?那么两个存储单元就能有四种组合00,01,10,11,能表示四个数,分别对应:0,1,2,3 。三个存储单元呢?就能表示2的3次方,8种组合,0到7之间的数。(一个存储单元叫做一个位:bit 。)

所以问题简单了,要表示多大的数都没问题,使用更多的位就行了。但是又有一个问题:位在内存中是连续排列的,如果我们用这三个位来表示一个数,用紧邻的后面6个位表示另一个数,问题是计算机怎么区分这两个数?计算机怎么知道第一个数占三个位,后一个数占8个位呢?

我们在写程序时,需要告诉计算机各个位是怎么组合的,这就是变量类型的作用,比如int a;我们知道a占32个位,char b;我们知道b占8个位。占三个字节的变量是什么类型? 对不起,没有。实际上计算机限于硬件的能力,规定最少也是8个位一起做作为一个访问单位。8个位叫一个字节(byte)。

计算机只认0和1 ,用0和1表示出的数叫做二进制数,但是程序员都是人啊,你给一个变量赋值不可能用二进制方式写数值。还有,赋一个字符给一个变量,我们也不可能每次都查到字符的编号,然后算出这个数的二进制形式。所以为了方便,数值可以用十进制方式表示,字符的话可以直接用字符表示(比如’s’),转成二进制数的复杂过程,就由编译器来承担了。

为啥经常看到十六进制呢?因为十六进制与二进制很容易对应,十六进制的数中,一个数正好对应四个位,比如一看到0xF,就知道是二进制的1111b 。

所谓进制,就是指到了多少需要进位,二进制的话,两数相加到了2就要进位了,所以二进制的10等于十进制的2;10进制的10就等于10进制的10;而16进制的10等于10进制的16 。

计算机中为什么只能表示0和1呢?这个嘛,只是证明了阴阳理论的正确性,呵呵。。。。。其实是一个存储单元只能用高电平和低电平来区分它的状态,所以只有两种状态。
上一篇:成为C++高手之函数
下一篇:成为C++高手之如何同时返回两个值

你可能感兴趣的:(C语言)