PC/FORTH 数字类型

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 会把他作为一个信号识别;表示该数应该转换成双字长数,然后将该数压入堆栈中的两个连续的“单元”,高阶在栈顶, c5qeHi4oqJCQ0ODzWarqqpSKBT83AdA6KUG+XyA3QIIRkCpQTACSg2CEVBqEIyAUoNgBJQaBCOg1CAYAaUGwQgoNQhGQKlBMAJKDYIRUGoQjIBSg2AElBoEI6DUIBgBpQbBCCg1CEZAqUEw4n8A5+0Os552t9UAAAAASUVORK5CYII=   eGd4vDwAA8Kn8AU0wXPmytxHLAAAAAElFTkSuQmCC             打印带符号的双字长数 D.  ; 按右边对齐打印双字长数 D.RZ49YQ3BqCW0P4BRi+u9Ax02oBAAAAAElFTkSuQmCC 



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



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

SablSMoiJFwAAAABJRU5ErkJggg==



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

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

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

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

vw4ULF2xsbISFhYfaEBwcnF8d3PXj4ODgDDvw4E4cHBycYQfu+nFwcHCGHf8PzHByrpXmLUcAAAAASUVORK5CYII=   


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

//如果要格式化表示单字长度的数据,但是<# #>只能表示双字节长度的数据,可以在<# 前面加上0,表示高阶为0 的双字数据。
tv4P64fX7czGoAADAO+L9XAMD8YNIBAOYHkw4AMD+YdACA+cGkAwDMDyYdAGB+fgFv+D8Y89EJFwAAAABJRU5ErkJggg==    ZvZhPPu64rwyMVbn2JWQMFKYyb3KwSPG8Atk+kw+5EUH0+SLzQVtFtkkp+f8SfceliABvFUUhc0U0G50l4tCSiENLIg4tiTi0JOL4AcY5I0ip2pR+AAAAAElFTkSuQmCC



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


混合字长运算符

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)    
Zn96mAndYjAAAAABJRU5ErkJggg==  //1*2=2,2的双字长度表示就是低位2高位0; 3NBg1yCJwAAAABJRU5ErkJggg==  59NUlN054TxTSCchZDQJhLaREKbSF7Lpevy7vo+RQAAAABJRU5ErkJggg==        VAsnJTAUFAwFBQMBQVDQcH8BwTV9yLYboMCAAAAAElFTkSuQmCC    xTAAAAADi4HEv5nFCQmr+PAg4wN43n7xuIxLMWD74Q1bePIaiJdtuHoFbQn8bT1vSL7LiHEPydCZDOb8mzZUIoCAAAAACg5AdwOhd+4oKDWAAAAABJRU5ErkJggg==    YSN7Bby4AAAAAElFTkSuQmCC    kISJp5L8rPQv0HyHwPoOBOmKgjhioIwbqiOEfoFRQwQTGJygAAAAASUVORK5CYII=

U<    (u1  u2  --  f)   留下两个16位数的无符号“小于”比较的布尔值。
U>    (u1  u2  --  f)   留下两个16位数的无符号“大于”比较的布尔值。
7+X3P3rAeioVBCQyFgqFQML82su8jckkEnQAAAABJRU5ErkJggg==      7IOjORIPAbVHjRvluk7ZJ9i8+x6aCut8eTaY+solJsFuqcdfk1P16uivywe5SYJadO+Vels9fZ4DKo9wLlZrGP6W7HBtMZjB+AakeqbIJo3SWSTRDZJZJNENkmss5Bd7xNb6vfThR9d6STlt5ne7blyikfSc+UcL30GODyaN0nIN1GIl76JIjzW8+ly14zqmyBahUhkk0Q2SWST5Bvew78KkvMS8AAAAABJRU5ErkJggg==     



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



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


..    连续两点,表示一个双字长0
gFN9WrYuLe+tAAAAAASUVORK5CYII=


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


转载于:https://www.cnblogs.com/meihao1203/p/10139669.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值