正在加载……
专注、离线、切勿分心
FORTH 堆栈有两个字节  宽度16位   能表示的无符号数的范围是 0~65535 用符号 “u” 表示。
表示有符号数 -32678 ~ 32767 用字母“n”表示。这就是单字长数范围。

算术移位
2*  (n -- n*2) 算术左移  比 2 * 效率高
2/  (n -- n/2) 算术右移  比 2 / 效率高



ASCII 码表  
空格32        !33         $36         .46           /47         * 42          -45         :58     



双字长数
32位
FORTH 中“字”表示一个被定义的命令。一个16位的二进制数据称为一个“单词”(cell)。一个双字长数需要两个单字单元。
.   数据含有这个词,NUMBER 会把他作为一个信号识别;表示该数应该转换成双字长数,然后将该数压入堆栈中的两个连续的“单元”,高阶在栈顶,              打印带符号的双字长数 D.  ;按右边对齐打印双字长数 D.R 



FORTH 中 .   是把栈顶值作为带符号数显示 
要显示无符号数要用词  U.   ( u --  )    



数基
FORTH 系统中默认的是十进制,但是可以输入命令转换
HEX   OCTAL   DECIMAL  执行这些词会改变数基




数字格式化
<#     #>        指明数字转换过程的开始和结束。#S  表示把栈顶值转换成  ASCII 码字符。TYPE  在终端打印出表示该数的字符。HOLD 取出数字所表示的 ASCII 值。
:   .PH#      <#   #   #   #   #  45   HOLD   #S   #>   TYPE   SPACE   ;     
定义字符表示,把输入的数按照我们定义的格式输出,数字格式化定义所转换的数位次序与将要打印的数位次序相反,# # # # 表示的是输入数据的最后四位,不足就补 0 ;然后输出 ASCII 码代表的“-” #S 表示剩下的数据。知道有几位数据也可以用 # 来表示;

   // .  表示连接两个数据,一般用来表示双字长度的数据。
   .DATE 是系统默认;现在从新定义,并在ok字符前打印一个空格。
:   DATE      <#   #   #   47   HOLD   #   #   47   HOLD   #S   #>   TYPE   SPACE   ;         
   
   //这个是把 #S 改成 # # ;

  
//因为时间的分秒倒数第二位的最大值时5,倒数第一 ‘鹅鹅鹅鹅鹅鹅位的最大值是9;所以在定义中,:00 先把最后一位按十进制输出然后倒数第二位按六进制输出。4500.  十进制输出最右边一位值0,剩下450,转六进制是2030,输出一位0作为倒数第二位;剩下的203进行第二个 :00 操作,先转十进制75,输出一位5,剩下的7转六进制11,输出1。最终剩下一个1直接输出。

!  将16位的n存入地址addr。定义不要也可以

   



数字格式化——带符号数和单字长数
定义一个显示美元格式的词
:   .$   <#   #   #   46   HOLD   #S   36   HOLD   #>   TYPE   SPACE ;    

//如果要格式化表示单字长度的数据,但是<# #>只能表示双字节长度的数据,可以在<# 前面加上0,表示高阶为0 的双字数据。
   



双字长运算符
   //以 D 开头的字只能操作双字,但是以 2 开头的在既可以操作单字也可以操作双字 



混合字长运算符

M*    (n1  n2  --  d  )     混合量乘,乘积为双字长数。
M/MOD    (d  n  --  rem  quot)     混合量除,带余数。
UM*    (u1  u2  --  ud)     无符号混合乘。
UM/MOD    (ud1  u  --  rem  quot)     无符号混合除。
MU/MOD   (ud  u  --  ud  u)    
  //1*2=2,2的双字长度表示就是低位2高位0;                 

U<    (u1  u2  --  f)   留下两个16位数的无符号“小于”比较的布尔值。
U>    (u1  u2  --  f)   留下两个16位数的无符号“大于”比较的布尔值。
          



一些术语
直接量(Literal):FORTH 中指的是出现在定义内部的数。
掩码(Mask):一个能用来“叠加”在另一个值上,以掩蔽或揭示我们感兴趣的某些位的值。
数字格式化(Number formatting):通常按诸如 3/13/81 或 $47.93 这样一些特定格式打印一个数的过程。



  
//循环找到无符号数的最大值;从0开始循环,每次+1后和0比较大小,如果小于0就意味着已超出单字长的限制。结束循环,在-1就得到单子长的极限值。


..    连续两点,表示一个双字长0


*********
    
   //OVER 为 IF 提供了正被转换数值的低字长单元。这个单元只有当该数值完全转换完毕是才为0。


posted on 2018-12-18 20:07  正在加载……  阅读(226)  评论(0编辑  收藏  举报