ITEEDU

10.3 数据转换程序

数据类型转换是输入输出过程中经常遇到的问题。输入时,计算机系统要把用户从键盘上输入的字符串转变成相应的数值,并存储在内存中;输出时,要把计算机内部的二进制数据形式转换成相应的十进制字符串,然后再输出。

在高级语言编程环境中,程序员能用各种输入输出语句,按一定的格式进行交互式操作,很少或根本不关心输入输出是如何实现的。有的程序员甚至认为其输入的就是十进制数值,输出数据也就是把内存中存储的数据直接输出出来。其实,输入输出过程并不是如此简单,计算机系统要进行复杂而又细致的数据类型转换和格式化等工作。

本节试图通过用汇编语言实现数据类型的转换来反映输入输出的本来面目,使程序员在用高级语言编程时,对其输入输出语句的实现过程有所了解,也知道有别人(或编译程序)帮他完成了输入输出的准备工作。

例10.7 编写一个程序,它能把字类型变量的数值以十进制形式输出出来。若该数值为负数,则需要输出负号"-",否则,不输出符号。

解:

鉴于按二进制输出的特殊性,我们可以把它优化成例10.8的形式,按十六进制输出也可以按“四位二进制对应一位十六进制”的规则进行优化的。

例10.8 编写程序,它能把字类型变量的数值以二、八进制或十六进制形式输出出来。若该数值为负数,则需要输出负号"-",否则,不输出符号。

解:

一、按二进制形式输出的程序

二、按八进制形式输出的程序

三、按十六进制形式输出的程序

例10.7是用“用16位除10”的方法从低向高依次得到每位的数值,但若待输出的数据是32位,用10除之后,其商很可能会超过16位,所以,不能简单地引用例10.7的方法来输出32位二进制。

假设:32位二进制数Z为A×216+B,其中:A和B都是16位二进制数。 用10去除A,得:A=A1×10+A2,于是, 

         

(1) 

假设A2×216+B被10除后所得的商和余数分别为B1和C1(B1≥0,C1≥0)。 

利用式(1)和“A2<10”,我们不难看出:Z的个位就是C1和B1<216。 

令Z1=A1×216+B1,显然,Z1就是Z/10所得到的商。 

对于Z1,再利用式(1)得到商Z2和C2。……,重复上面的步骤,直到所得商为0为止。

下面的例10.9就是利用上面方法来输出32位二进制数值。