计算机网络的四种编码方式(深入理解计算机系统-从几个编码细节看计算机信息的表示和处理)

一个案例

我们经常看到有一些“长者”会说,在做数值大小判断的时候,用a - b > 0,来代替a > b此类的细节处理。这样可以避免数值超过定义类型范围时,在减法运算数值范围内,可以得到正确的结果。我们看一下这段JAVA语言代码,试下你觉得会得到什么结果(原创声明:AI小宾)呢?

private static void m1() { int a = 999999999 * 9; int b = 999999999 * 8; System.out.println(a > b); System.out.println(b - b >0); }

结果是true、false;

计算机网络的四种编码方式(深入理解计算机系统-从几个编码细节看计算机信息的表示和处理)(1)

现代计算机储存和处理信息

现代计算机存储和处理以二值信号表示的信息。这些普通的二进制数字,或者位(bit),形成了数字革命的基础。大家熟悉的使用了1000多年的十进制(以十为基数,base-10)起源于印度,在12世纪被阿拉伯数学家所改进,并在13世纪被意大利数学家 Leonardo pisano(更有名的叫法是Fibonacci)带到西方。使用十进制表示法对于有十个指头的人类来说是很自然的事情,但是当构造存储和处理信息的机器时,二进制值工作得更好。二值信号能够很容易地表示、存储和传输,例如可以表示为穿孔卡片上有洞或无洞、导线上的高电压或低电压,或者磁场引起的顺时针或逆时针。基于二值信号的存储和执行计算的电子电路非常简单和可靠,使得制造商能够在一个单独的硅片上集成百万个这样的电路。

单独地来说,单个的位置不是非常有用。然而,当我们把两位组合在一起,再加上某种解释( Interpretation),即给予不同的可能位模式以含意,我们就能够表示任何有限集合的元素。比如,使用一个二进制数字系统,我们能够用位组来编码非负数。通过使用标准的字符码,我们能够对一份文档中的字母和符号进行编码。在本章中,我们将讨论这两种编码,以及表示负数的编码和近似实数的编码我们考虑三种最重要的数字编码。无符号( unsigned)编码是基于传统的二进制表示法的,表示大于或者等于零的数字。二进制补码(two's- complement)编码是表示有符号整数的最常见的方式,有符号整数就是为正或者为负的数字。浮点数( floating-point)编码是表示实数的科学记数法的以二为基数的版本。计算机用这些不同的表示方法实现算术运算,例如加法和乘法,类似于相应的整数和实数运算。

浮点运算有完全不同的数学属性。虽然溢出会产生特殊的值 ∞,但是一组正数的乘积总是正的。另一方面,由于表示的精度有限,浮点运算是不可结合的。例如,在大多数机器上,C表达式(314 1e20)-1e20求得的值会是0.0,而3.14 (le20-l20)求得的值会是3.l4通过研究实际数字的表示,我们能够了解可以表示的值的范围和不同算术运算的属性。对于编写在全部数值范围内都能正确工作,而且可以跨越不同机器、操作系统和编译器组合的可移植的程序来说,这种了解是非常重要的。

计算机网络的四种编码方式(深入理解计算机系统-从几个编码细节看计算机信息的表示和处理)(2)

信息的存储

大多数计算机使用8位地块,或叫做字节(byte),来作为最小的可寻址的存储器单位,而不是访问存储器中单独地位。机器级程序将存储器视为一个非常大的字节数组,称为虚拟存储器( virtualmemory)。存储器的每个字节都由一个惟一的数字来标识,称为它的地址( address),所有可能地址的集合就称为虚拟地址空间( virtual address space)。正如它的名字表明的,这个虚拟地址空间只是个展现给机器级程序的概念性映像( Image)。实际的实现(见第10章)使用的是随机访问存储器RAM、磁盘存储、特殊硬件和操作系统软件的结合,来为程序提供一个看上去统一的字节数组。编译器和运行时系统的一个任务就是将这个存储器空间划分为更可管理的单元,来存放不同的程序对象( program object),也就是,程序数据、指令和控制信息。有各种机制可以用来分配和管理程序不同部分的存储。这种管理完全是在虚拟空间里完成的。例如,C中一个指针的值(无论它指向一个整数、一个结构或是某个其他程序单元)都是某个存储块的第一个字节的虚拟地址。C编译器还把每个指针和类型信息联系起来,这样它就可以根据指针值的类型,生成不同的机器级代码来访问存储在指针所指向位置处的值。尽管C编译器维护着这个类型的信息,但是它生成的实际机器级程序并没有关于数据类型的信息。它简单地把每个程序对象视为一个字节块,而将程序本身看做一个字节序列。

字的概念

很多人工作久了以后,就对字(bit),字节(byte),有些忘了,或是一些非计算机专业的转行者,根本都没有这块的概念。

每台计算机都有一个字长( word size),指明整数和指针数据的标称大小( nominal size)。因为虚拟地址是以这样的字来编码的,所以字长决定的最重要的系统参数就是虚拟地址空间的最大大小。也就是说,对于一个字长为n位的机器而言,虚拟地址的范围为0~2-1,程序最多访问2n字节。今天大多数计算机的字长都是32位。这就限制了虚拟地址空间为4千兆字节(写作4GB),也就是说,刚刚超过4×10字节。虽然对大多数应用而言,这个空间足够大了,但是现在已经有许多大型的科学和数据库应用需要更大的存储了。因此,随着存储器价格的降低,字长为64位的高端机器正逐渐变得普遍起来。

数据大小

计算机和编译器使用不同的方式来编码数字,比如不同长度的整数和浮点数,从而支持多种数字格式。比如,许多机器都有处理单个字节的指令,也有处理表示为两字节、四字节或者八字节整数的指令,还有些指令支持表示为四字节和八字节的浮点数。

那么案例里的JAVA语言的int类型的长度是多少呢?如下图,4个字节。

计算机网络的四种编码方式(深入理解计算机系统-从几个编码细节看计算机信息的表示和处理)(3)

4个字节,也就是4*8=32位,2的31次方减去1,就是2 147 483 647。这是他的大小的计算方式。我们示例里的计算后的值,会超过这个数得到的是一个负值。这就是我们看到这个结果的原因。编写不易,关注支持一下哦,下个接着这里写写计算的寻址和字节顺序

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页