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 ;
![c5qeHi4oqJCQ0ODzWarqqpSKBT83AdA6KUG+XyA3QIIRkCpQTACSg2CEVBqEIyAUoNgBJQaBCOg1CAYAaUGwQgoNQhGQKlBMAJKDYIRUGoQjIBSg2AElBoEI6DUIBgBpQbBCCg1CEZAqUEw4n8A5+0Os552t9UAAAAASUVORK5CYII=](https://i-blog.csdnimg.cn/blog_migrate/77d76a4600b3d4845040ba13d00f8bdc.png)
![eGd4vDwAA8Kn8AU0wXPmytxHLAAAAAElFTkSuQmCC](https://i-blog.csdnimg.cn/blog_migrate/449cb837ebf074387d48d6c4554764fd.png)
![Z49YQ3BqCW0P4BRi+u9Ax02oBAAAAAElFTkSuQmCC](https://i-blog.csdnimg.cn/blog_migrate/989cf000a1164b99cfa544e9d9344913.png)
FORTH 中 . 是把栈顶值作为带符号数显示
![EgD4SBAoJAoUEgUKCQCFB+AeiMd2URsc92AAAAABJRU5ErkJggg==](https://i-blog.csdnimg.cn/blog_migrate/f75c6d17f8964514b461dd5660d90872.png)
数基
FORTH 系统中默认的是十进制,但是可以输入命令转换
HEX OCTAL DECIMAL 执行这些词会改变数基
![pdxh3CadVaSC3Hx456ymE8Ru7l6za1yQwpRMts1GxEhPejq0POIDLpBySMc+6s8soisV4s45SNO4dbxiHEh2XKAIsYjQgHXmiGBIEICQYQEgggJBBESqu7XHGOcImpU3a+ZcYpopcGumTyh3p5dc4xximiiwW1ynYsxThGGBncnrUcK0ebupEAlifOIDNKB6zcrByCLN7enRWScItpjPCIUSBwjAgQREv4BHJvg0jFNPuUAAAAASUVORK5CYII=](https://i-blog.csdnimg.cn/blog_migrate/7f6f3a64a6ae6b6edf26ffb9370424df.png)
![SablSMoiJFwAAAABJRU5ErkJggg==](https://i-blog.csdnimg.cn/blog_migrate/c04c47c440416885f20d7ff81c0430ea.png)
数字格式化
<# #> 指明数字转换过程的开始和结束。#S 表示把栈顶值转换成 ASCII 码字符。TYPE 在终端打印出表示该数的字符。HOLD 取出数字所表示的 ASCII 值。
: .PH# <# # # # # 45 HOLD #S #> TYPE SPACE ;
定义字符表示,把输入的数按照我们定义的格式输出,数字格式化定义所转换的数位次序与将要打印的数位次序相反,
# # # # 表示的是输入数据的最后四位,不足就补 0 ;然后输出 ASCII 码代表的“-” #S 表示剩下的数据。知道有几位数据也可以用 # 来表示;
![ts8kcND+SAtr0xI3d44Vzqf1Q2tP2GjupHne3YAMANP3mcHAOBB7ABgChA7AJgCxA4ApgCxA4ApuPTdWACAXtjFDpkDgBvxD3r6uyHbeCLmAAAAAElFTkSuQmCC](https://i-blog.csdnimg.cn/blog_migrate/0544781f79642260f8513963a58106fd.png)
![kP8BQNyimq8z8AAAAASUVORK5CYII=](https://i-blog.csdnimg.cn/blog_migrate/139317daa5debd891e8a1ef5a7e5b563.png)
![8YvThxjj7c8JqMAAAAASUVORK5CYII=](https://i-blog.csdnimg.cn/blog_migrate/8a9bd4b6aefcc11d9df11a9d98640861.png)
: DATE <# # # 47 HOLD # # 47 HOLD #S #> TYPE SPACE ;
![3vHzyMLeD4kAAAAASUVORK5CYII=](https://i-blog.csdnimg.cn/blog_migrate/ee746614b40d03b0d45e456c851e293b.png)
![ZHbr4AAAAASUVORK5CYII=](https://i-blog.csdnimg.cn/blog_migrate/00c97358841c224386d388ff203a9dba.png)
![B8kIAAAAAElFTkSuQmCC](https://i-blog.csdnimg.cn/blog_migrate/ca88c09cc3cfcb9a11507fdf55e59ae0.png)
![ED2cOD+bEJPocAAAAASUVORK5CYII=](https://i-blog.csdnimg.cn/blog_migrate/f7fc616dbd7bf5e9214434ebb948599b.png)
//因为时间的分秒倒数第二位的最大值时5,倒数第一 ‘鹅鹅鹅鹅鹅鹅位的最大值是9;所以在定义中,:00 先把最后一位按十进制输出然后倒数第二位按六进制输出。4500. 十进制输出最右边一位值0,剩下450,转六进制是2030,输出一位0作为倒数第二位;剩下的203进行第二个 :00 操作,先转十进制75,输出一位5,剩下的7转六进制11,输出1。最终剩下一个1直接输出。
![MzLDwAAAABJRU5ErkJggg==](https://i-blog.csdnimg.cn/blog_migrate/d8052bf1151a636b298f44c19b34d5a6.png)
!
将16位的n存入地址addr。定义不要也可以
![vw4ULF2xsbISFhYfaEBwcnF8d3PXj4ODgDDvw4E4cHBycYQfu+nFwcHCGHf8PzHByrpXmLUcAAAAASUVORK5CYII=](https://i-blog.csdnimg.cn/blog_migrate/3b70f350f5b159a6bd02b84f599b617f.png)
数字格式化——带符号数和单字长数
定义一个显示美元格式的词
: .$ <# # # 46 HOLD #S 36 HOLD #> TYPE SPACE ;
![IvDSJaB0yuk4JJGMSWb6HNrYu9YeboFYPQAAAADA6vwDDCUwWDwqEeEAAAAASUVORK5CYII=](https://i-blog.csdnimg.cn/blog_migrate/2fdd1822619120bb81860d005784649c.png)
//如果要格式化表示单字长度的数据,但是<# #>只能表示双字节长度的数据,可以在<# 前面加上0,表示高阶为0 的双字数据。
![tv4P64fX7czGoAADAO+L9XAMD8YNIBAOYHkw4AMD+YdACA+cGkAwDMDyYdAGB+fgFv+D8Y89EJFwAAAABJRU5ErkJggg==](https://i-blog.csdnimg.cn/blog_migrate/b40fb5d9adb09b724d0baf9345e00e05.png)
![ZvZhPPu64rwyMVbn2JWQMFKYyb3KwSPG8Atk+kw+5EUH0+SLzQVtFtkkp+f8SfceliABvFUUhc0U0G50l4tCSiENLIg4tiTi0JOL4AcY5I0ip2pR+AAAAAElFTkSuQmCC](https://i-blog.csdnimg.cn/blog_migrate/230169102fb3dea36ce906372f3852bb.png)
双字长运算符
![x8GmOXQKoFyrAAAAABJRU5ErkJggg==](https://i-blog.csdnimg.cn/blog_migrate/67163416c9ce164a070f85a4c9d5ab6d.png)
![ATA5+L0QmB3UAJgd1ACYHdQAmJ1fB7OgW3HDfyEAAAAASUVORK5CYII=](https://i-blog.csdnimg.cn/blog_migrate/7bdc27db98cc9cb1d3232d40d63bfac2.png)
混合字长运算符
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==](https://i-blog.csdnimg.cn/blog_migrate/165c0c961476cd9996f91efdcf026f91.png)
![3NBg1yCJwAAAABJRU5ErkJggg==](https://i-blog.csdnimg.cn/blog_migrate/d0c7939f41534dcc8902aa397393c121.png)
![59NUlN054TxTSCchZDQJhLaREKbSF7Lpevy7vo+RQAAAABJRU5ErkJggg==](https://i-blog.csdnimg.cn/blog_migrate/f68689450f284666b853142290c237db.png)
![VAsnJTAUFAwFBQMBQVDQcH8BwTV9yLYboMCAAAAAElFTkSuQmCC](https://i-blog.csdnimg.cn/blog_migrate/1990c06a87d138a3c9b31f16c2122903.png)
![xTAAAAADi4HEv5nFCQmr+PAg4wN43n7xuIxLMWD74Q1bePIaiJdtuHoFbQn8bT1vSL7LiHEPydCZDOb8mzZUIoCAAAAACg5AdwOhd+4oKDWAAAAABJRU5ErkJggg==](https://i-blog.csdnimg.cn/blog_migrate/d6fd185619999f6734cf395c0f3d1d71.png)
![YSN7Bby4AAAAAElFTkSuQmCC](https://i-blog.csdnimg.cn/blog_migrate/f56d851afde6845528afa060eb65377a.png)
![kISJp5L8rPQv0HyHwPoOBOmKgjhioIwbqiOEfoFRQwQTGJygAAAAASUVORK5CYII=](https://i-blog.csdnimg.cn/blog_migrate/87d3533600d91d6b90b7a1bef70ac7db.png)
U< (u1 u2 -- f) 留下两个16位数的无符号“小于”比较的布尔值。
U> (u1 u2 -- f) 留下两个16位数的无符号“大于”比较的布尔值。
![7+X3P3rAeioVBCQyFgqFQML82su8jckkEnQAAAABJRU5ErkJggg==](https://i-blog.csdnimg.cn/blog_migrate/3999f44570629b8af4ec6f245e53efce.png)
![7IOjORIPAbVHjRvluk7ZJ9i8+x6aCut8eTaY+solJsFuqcdfk1P16uivywe5SYJadO+Vels9fZ4DKo9wLlZrGP6W7HBtMZjB+AakeqbIJo3SWSTRDZJZJNENkmss5Bd7xNb6vfThR9d6STlt5ne7blyikfSc+UcL30GODyaN0nIN1GIl76JIjzW8+ly14zqmyBahUhkk0Q2SWST5Bvew78KkvMS8AAAAABJRU5ErkJggg==](https://i-blog.csdnimg.cn/blog_migrate/c43efe987b8a3e874deb55bdb7eb000e.png)
一些术语
直接量(Literal):FORTH 中指的是出现在定义内部的数。
掩码(Mask):一个能用来“叠加”在另一个值上,以掩蔽或揭示我们感兴趣的某些位的值。
数字格式化(Number formatting):通常按诸如 3/13/81 或 $47.93 这样一些特定格式打印一个数的过程。
![dEAAA1rL5PBACwOHAiAIAq4EQAAFXAiQAAqvgDFivzXJe2htcAAAAASUVORK5CYII=](https://i-blog.csdnimg.cn/blog_migrate/c00446c3776c1e70abe21245f859d649.png)
![wx3szh0i7rDerBsmihXl3Vh96BwHwvOLwDHIeq9jtl17PlYb3x8NPYivuG4Eda7Eda7Eda7Eda7Eda78QGgLBJiajjNugAAAABJRU5ErkJggg==](https://i-blog.csdnimg.cn/blog_migrate/8262306b30fa1130a0c5734a3aec5e8f.png)
//循环找到无符号数的最大值;从0开始循环,每次+1后和0比较大小,如果小于0就意味着已超出单字长的限制。结束循环,在-1就得到单子长的极限值。
..
连续两点,表示一个双字长0
![gFN9WrYuLe+tAAAAAASUVORK5CYII=](https://i-blog.csdnimg.cn/blog_migrate/041f0ebf3df24efa3a04e463b8f0720e.png)
*********
![AAAAAElFTkSuQmCC](https://i-blog.csdnimg.cn/blog_migrate/7768378563f52c334ad1f9cc789f8e98.png)
![IkzBMAAAAASUVORK5CYII=](https://i-blog.csdnimg.cn/blog_migrate/dd0ef7866a53c39f68cec38eaea03487.png)
![gMtHvJymp1riQAAAABJRU5ErkJggg==](https://i-blog.csdnimg.cn/blog_migrate/9aa5eaa29ad27aa901d9d1a543a8e665.png)