xiaoysdf 发表于 2007-3-15 14:00:14

请问马潮老师,有符号定点小数的存储格式

马老师:我至今还不清楚AVR单片机中有符号定点小数其符号位和小数位在存储单元中的位置以及其存储格式,



另外在单片机内部是如何执行有符号定点小数和无符号定点小数加减乘除运算的,在执行运算时是如何影响状态寄存器的,尤其是V标志位

machao 发表于 2007-3-16 01:09:21

这个问题比较复杂,只有对计算机原理和汇编非常熟悉的人才能真正的理解。



首先,建议你采用C语言编写程序,这样你就不必考虑小数如何表示及处理的。另外在单片机程序中,尽量使用整型变量,如把数扩大100倍或1000,变成整数处理,显示时,将小数点位置左移2位或3位显示(汇编也可以采用这种方式的)。因为浮点数的计算非常浪费时间和资源。



下面简单回答你的问题:

    在计算机中,实际上CPU根本不知道你的数是什么格式的。例如,在内存中一个数10010101,你说它是二进制无符号整数,他就代表149,你说它是压缩BCD数,就代表95,你说它是有符号整数,它代表-106,所以只有程序员知道它代表什么,下一步应该如何处理。因此,当程序员认为10010101代表BCD数的话,要同另外一个BCD数做加法的话,他就要选择采用哪条CPU指令来处理了。如果CPU有BCD数相加的指令,当然可以直接使用,但没有的话,就只能使用二进制数的加法指令,然后再进行BCD调整,最后的到正确的BCD格式的结果。

   

    因此,AVR并不规定你的数是什么表示法(只需要使用补码方式),是程序员必须知道你的数是什么格式的数,应该如何处理!



    使用C编程时,为什么要对变量进行声明,是无符号整数,还是有符号整数,还是实数?

就是通知C编译器,对不同类型的数采用不同处理方式。C编译器会根据你的变量类型,将数据进行转换,处理(使用一大段的汇编指令代码)。当然这些都是对AVR非常熟悉,而且非常精通AVR汇编的人写好的一大段程序让你方便的使用的。而不是CPU自己识别的。



   以上不知道你能否理解。想真正搞明白,好好打基础吧。把微机原理和汇编的课程认认真真的学习一便。



===================================================================

xiaoysdf 发表于 2007-3-18 11:37:10

谢谢马老师,你的解说一下子使我明白了很多。我买了好几本avr的书里面都没有你说的这些内容,这几本书的内容都差不多,而且有一本还是原原本本将avr的手册翻译过来的,这使得我在学习过程中经常感到很困惑。不知马老师有没有出书,有的话我一定去买一本。

machao 发表于 2007-3-18 15:31:45

你看的手册翻译说不定就是我做的书。真正要学习和掌握AVR或其它单片机的应用,需要一定的基础,否则无法深入下去。应该具备“微机原理”、“汇编语言设计”、“C语言设计”,“数字逻辑”、英语等课程的基础。



一般介绍单片机应用的书,针对的是具备了上面基础的人使用的。有些基本的道理就不会介绍了。我做的手册翻译这类的书,不是针对初学者的,主要是面对有一定的基础和专业工程师们参考的。

bigrocks 发表于 2014-1-23 15:59:38

mark
学习了
页: [1]
查看完整版本: 请问马潮老师,有符号定点小数的存储格式