baitang36 发表于 2022-10-8 15:22:53

AutoLisp中的整数研究

本帖最后由 baitang36 于 2022-10-8 20:41 编辑

先看一段源码:
(defun tt ()
(setq a 127)
(setq b 129)
(setq c 32767)
(setq d 32769)
(setq e 1073741823)
(setq f 1073741825)
(setq g 2147483647)
(setq h 2147483649)
(setq i 4294967295)
(setq j 4294967297)
)
;(vlisp-compile 'st "d:/00/tt.lsp")
编译后,解码是这样的:
Offset      01234567   89 10 11 12 13 14 15
00000000   0D 0A 20 46 41 53 34 2D46 49 4C 45 20 3B 20 44      FAS4-FILE ; D
00000016   6F 20 6E 6F 74 20 63 6861 6E 67 65 20 69 74 21   o not change it!
00000032   0D 0A 37 38 0D 0A 31 3420 24 14 00 00 00 00 32
00000048 7F 06 0D 00 33 81 00 0000 06 0C 00 33 FF 7F 00   
00000064   00 06 0B 00 33 01 80 0000 06 0A 00 33 FF FF FF   
00000080   3F 06 09 00 33 01 00 0040 06 08 00 33 FF FF FF   
00000096   7F 06 07 00 09 06 00 0605 00 09 04 00 06 03 00                  
00000112   09 02 00 0B 06 01 00 1624 0D 0A 31 35 35 20 34         $155 4
00000128   20 24 14 01 01 01 00 3200 32 18 2A 39 01 00 5B    $   2 2 *9[
00000144   54 54 00 00 01 01 43 0000 03 00 0A 32 00 32 4E   TT    C   2 2N
00000160   2A 39 01 00 5B 4A 00 003B 34 32 39 34 39 36 37   *94294967
00000176 32 39 37 2E 30 00 5B 4900 00 3B 34 32 39 34 39   297.0 [I;42949
00000192   36 37 32 39 35 2E 30 005B 48 00 00 3B 32 31 34   67295.0 214
00000208   37 34 38 33 36 34 39 2E30 00 5B 47 00 46 00 45   7483649.0 [G F E
00000224   00 44 00 43 00 42 00 4100 00 5C 00 00 43 00 00    D C B A\C
00000240   0E 00 0A 5C 00 00 32 005B 54 54 00 00 3A 01 43      \2 [TT: C
00000256   03 00 01 00 1C 14 01 0000 00 09 02 00 0A 57 00               W
00000272   00 00 00 09 03 00 06 0100 09 01 00 16 16 00 E1                  ?
00000288   5E 7A 37 A8 22 0A 3B 6661 73 34 20 63 72 75 6E   ^z7? ;fas4 crun
00000304   63 68 0A 3B 24 3B 41 3130 2F 38 2F 32 32         ch ;$;A10/8/22

可以看出;
1)小于128的整数用 32 xx 表示,数字占用一个字节
2)大于127的整数用33 xx xx xx xx 表示,数字占用4个字节
3)2147483647是最大的整数,是33 FF FF FF 7F,比它大的整数都变成了带小数点的实数。
4)4294967297是3B 32 31 34 37 34 38 33 36 34 39 2E 30,直接是用ascii编码的字符串
现在有个问题,如果需要大于的2147483647的整数,该怎么办呢?

在64位acad下再做一个试验:
命令: (load "c:/00/trf_9.fas")
命令: (tranf "_addr-of")
T
命令: (_addr-of princ)
2095471388416
命令: (setq a(_addr-of princ))
2095471388416
命令: (type a)
INT
命令: !a
2095471388416
_addr-of是一个保留函数,它的作用是读取一个符号的内存地址,内存地址是个大整数。
但这个大整数有点问题,不能进行任何运算,+1就变成小整数了。

aeo000000 发表于 2022-10-8 16:09:04

不可能有更大整数,再大就必须变成浮点的

vitalgg 发表于 2022-10-8 16:11:00

本帖最后由 vitalgg 于 2022-10-8 16:58 编辑


CAD中就算是浮点数,其十进制有效数字,也只有16位。再大的数也没有意义。



斐波那契 数列的第 6666 位的值。


浮点数也是有范围的。


命令: (@:fib 66666)
"104843111885549435442642613777884512505771748394633542828156168423390591801996044022397878706144455332738751710503647508357667532968107045321353112405161914361665777048078325465646008065218870630583991941842126871702430273277730651276138623026125571202040347561827110316661863049320476327239088841686212556711867740069792724802471439582737224786931468868416007474702117970024940818015632791476727072904771710566391005530080051580960415479782084414589185887110402087380653976137886812817363661753884116905949616671108176601122067145567225755406014633389244945608954867846409531186761471258308665559526079931491190921775426783306928298420910495546551903650370363035149865607117677457528973264229262901257479747480825012262570499258770572677599561183737612060648734496605197956062310756180654240436024803324437322165518912095396229809995651103074974446586511936784473527583849844092588484345973509204217912939785891526071651735944690382741671523371729583902383649079663971700517667030434646749115743744850524300700183813769653642363542277088264419223644133420405016965756173427764895402687071158066718566308367564427745559294612191746905363040512548605424270603392869727529134854921392109172962331954603911821160408384393188461553184230098899532309432065214029222427706050871315954892217471512166740594264253544913728070111855850897791676058084400910701296680510036020455809495928018774283625358187731923166748188481385997507245271102819207262735489614848096563079922673839008829614930362742863129159410540107604160503036190352973077735170342859202941571420222671577594692160816833387935010944834723461671693692803256517759668863684997884321153062754816245221171183908964034932235108638135994451893796275142319024050511725627563675307058730169854874029158848399419990428613156522109415288840172021386552077008056674566164776540892067442456530990304829479080938158012319606723499582880999368638610318649925156926188397782845103826610716674722614765431391320858010387660516565502137906285114412404072355872342455171602054612363427646698133722743450508882987211078240954358459070174658706869736695443810040054628318064105009289483004055840537703650039049154331726189293214623598370836479358093501251942142923833316014538424597066345111485483620949556781845175704994826373714414622010904102340597231701495059668420976301881398949121823413574093896311572714558398388982209491737688805933051135949885198566904223006993184190767752858148320583986715861601252854229776150176467628869439220104280012301139970170108203627401949070415636125060745824252904188053219202993457805117694790003348314393175392485591582353350490919108590922532747442079314623342763182854875807937745682532845862932243141122849715479454932411570516191416885868726483082996967832579822279667513258919680061612937099547466269243333059287001580383621835434915141902723415644331943181901660040729179764701449765603855692460931836432660541599875036066259125148751553890021524135417117982137796772049181846788713518964423315249728436250943506652230172099885539861472018711189915488278525940675694354142742703588762504917457420994043841783835616278477781208874153446441934797442119343418641901156452722175383490928645681849886193382465787081190333167055441331962422070135832351150908689251670564952578940993608891078021268289402680443975608618602273984129909115387104420429139242272447128158470604691869324357743738491272703597771024024698769134953061755958515267421492885242572836670147963775231095984803796151577854685202182692292065050982087915302300127454665620314492397553843224832758599614834995486497454724462667068596612455078033991739978310125969218631160456872033140043121975632825858913358769085410596654093124596559390962345279358068765240329045597382100282990119835713059309728898928966290031653877507173285537075360175910192610190159943150397084121569026967793697216238932799261295160278509438008644520137157631335918521217293191614564081564495495325879096924898326037271544711666442230995949955396758630583304601291509140178653440491851760426556000021545407997214078076439418212341684774446676405408450381005666000012532497714
5954181991633078329287892833944946664927930125589899983289457253934658418762868518680024847418180118772054110271815190206451479882377724185045261015106064895078771610730569617718683321519910318799262476286498480168823885255496012241108902359394197651762908283768250991036236674778736563382759307261658705305825221681423316344603949738926266436674274539659121609507553469575186896394221335904341443033292465427462443428633175262300198361496260211972951401323130054600418144195060235985534605742467019617647718826728464025286459968817647686267530329350047152863054912149286818953914016799736074602663716476484086686621798854343435175922236494852789804431358172994970545766184121863933351984497966975099856117373550412204598545239891436991447117037808594126690870032482073211332460408035993752909250769311609165983844067340074054453850697954575619992594006387465230104182772756962160894872605401706376351487231177177664467869319719141253669175932279662885350707339440028902339711631232138395164099708022246426980482439545439802791507037925436337240489246445216631036237083838260539837461856182352212445264738391563576570601433804729563680253912971704736986441143529190510537834033515322105375312714697221194053905159529065979106092466701218343858023028502573124856242417779286533775645865184357564179591766406270529902735632679816677182836681438333790268059911669203623193392702670003698478696572287687547260072072424207609639597148360075807416221243901716709941010600509936219766926834493961973165535772846349604400305727168454532958427449411693282664656932628420300749681030424282922577027239282925550493474261813090700898939241303698808259406412773273766885523502694131885592133813742870132328754419752532550644376177135854147162958686561612494729672666109567605060307858809956499239665239957694165173381241603930511183128287638825685734618813783376445497345187845497653017343217997389462501305515855652114501571257693688579545186709985906973936611600486563706951188816789616041065033349907584496656277589013967928566286125976943350692239415966689458239621810081264901270614918167525523508435389341408034832539984772163577689555905612671587986042300230305170447861609513262010241595959025551592362623038684744401442516392336021970222885944244912392403308237955432208455662370348722599355513963036955237894451121169721933663226547454976781851801413646815501970947258843532513215608596343401853007807988060105796499794545567905026880716250769542207458173317331616103317368311874724747440642619815687946417204136374300256992145897848416995263423146142951135930867365150586183248185824912284232845488110369439072590089527869909092203017121952902971217722478183585501801106766817313346991623021457749949499351416926959685591229285274400525664256700818128511839535136191498453040844911104516655141540499361706870782830893147537223546536910738128774756147629355923245209756767276330139008266411883046241670282877903960771906475649389141623695626837329856031497746446080504896188066718178540197499527990046944006638763732176766234425500529045413652525782818371227483834050957735408863802764773934317096297494407232863494401094365444524856536569915359992160642933538511320750074227912868717110037161713881472631041529282379229960811024068551327862449936791725222838971624552533631182213460740801856808799582866919252059523537612625198930142915380466282220382046665485939616964721691141935138867272032826791169022709949881846065072407351181051315968701948582548831884009635939277137660735245886530370828916594870747058478700473092051966966627505830000399595251756516424036600170217929870783204333335278908509307001049123313591226141270638092344440786539348934702732717282427139549504036067771858610473518003719445138587877717511349324212495859574439139613393325608816622694106973442616900980746130361750975910303825991376485801906316893450003736680032087490605278022005173973597941560900299945828597503663799972095730023570085538335031694663470415215568202163630042443855577375963320489428908095249076354579286377990384632148453659066305881285198537943406569789776491528690599444011762747677184998910477679
4070903175736574740801664819910129430543442769767735561074221611262666012104975922229429156210048528861888060440654009767018095852216323592966259759312462034278002168930808335249749301921907806118004992282994960046994770403039849467753077901076691696671229736412665944775510913009983730817268338714872515733344261643203469968698655476447987488161816631013849130002143037238231132252583231347968979196427422557217810894759463352003409845297356620318072395873391903713249978863788326007139044102248599093641431178235795153397652943072174365610980391711069498062534607462359902030266722391934633836144638157766312964037069925969441302189763147972720710040279371273309340890010947283251342526711426575234113377282781777615680009956332864453633353741998906900690488359937669231153985326734836761723122087904422389331506536162026068875653513126384012426021760435328229023748667455263359089627952465959883636777429840985962754107125513611309684303987873385469973056829057902487463748678063492055344936506955223270350604034343567662133934171683781784826201484761767820758976283312522660425745035400579384119756142169782407261218909430336481849540930463069709571810050051996852930295058465782156964226980240354399336410849128688037351945803857873691149867459763882243101410784804733990641990528971104253451355747248018110886136154548684650350832809555951339569498399010711561073914575826375530887704857751368660178241762224408085653109351600918474805029312239083553594105661489739760952277795724145130831861382672948240256275086056779256235056478112993290183577001795838131048393387564988692445132928501578921151622846359883252861116865512826202110293077003428877628542986445307042966137594345814593224113189880035264663848225676266275465149948378051819290041404530736617891326334789354748204627418234728213459879830017258599686339331843091740009885864796289343512634751292893505167173537541409425271455127791401103950214282067363429070734640864101813305824542646493422393242413736156063743156937388820920413503042143817442692491604865145840654891137456183183346183347287898577686614490118249730938146704947787132988925147627717966798691659011358250819147478877481189634457768759731967830076157030329475741254133689075345098529660140856383753695264646177421184071471244550654714025279556354982946826917923682833638159777558438194477889019714219103081715834602062101383412516792516641752392264640527539238072186193665270599804567488684903538623194245244528048590505989239351193141162463478017963653542161299643930036216377046870531795677231334447790064882069115063053241548447926260370543911329111070787552830240954807105295794855374102623159625812155609508416447541478482329974579066563631801181635027712468319565234082326217337193778394097959146193569490376153163439010628892478056916805710774667219411713723201897645740870036870242198864495843892984863900690590355802872395251406230220572749959893829246496712204959270551901294294165133816653285231033643198555551084562400235180724192024810828777073420687348735197096915620561902434572994748310730350975698670499062883244325538055534883190153983993858345620320183804447164039037495919854275057493608107827636358300755417207632087877753089190702703764139776661902144168039748060012534687705905797771126331521895847295845135265473168841480684872808277149730158353376239166855825312101519556515887029753632705931717080335168832669357061438738230784887706949583157927001945065594560210079786168101974503717487313874571985847680527449673281223935078682025954661652745193415726707573208523289052294449604558254486446781103391146847835224365270626552063629162517595202791048155799898869487437163845851478068047568270719761685941902525388009659996935700463722407862191533759151867049029056453375443248908553463267251558211479326229597700533846094989844716106693380415564687065566805411998545633279708937418113272558449407331852481094888585809432105092684691773824868801456186475930681178354241115347788331720865954819651546621502350090365357980371167812497569224924750605692806623356444714678593670823573593740727439834649926360865241645447906380149577634366190
74917119327762549458271494744045130652448041340992286286574955101229312752496066755423666434353014367036170259918769854043752075384728006977080801275206969639414610277415227622100721650756331500111282454807749506425170710058492307399558304836905539053602342445718326522057960767003368757854467868845501487110453617854601245552875416329691054386508207306280158623978829902531477820914211826082647111162807732785151599034823475430121381185123837958213047926445617802192329323230717648887871383893295053579133498231242936470555282269427391228971314434809844161762475778470245983829682181773928735816808642154832120094853310916184934221168068634360849350155965996576386901086752614827036728165395954267213492929372014927770189804276215095845993373148676549536267093527956130205852911229856452525021368323170177715214767421848465217810763871099601551423523315311270344775221893428869545490361559271396907914866794023334970446674672604897919698024614081049745103133526514769202778447023831385380598913678660249508580273912728118770224997925203091724830153789842070283994604897623785727335889191216468220761787213974633725798755920531573769968095450439388818582466388844166923366458935366608640277043277588365354461307396531155670139131108271321438394632197128426910466866889864117364079367444023392795331837453553597463197294747813450406761576862296176231410373439198354227439913519820443451746186895369042597694702697780069465330504347762813995142227288765544327202777143688448596300473645170628648443800561552715185195357908189700151357637014683477017417039744296223712449038152413237973788616049810429935698579059659884825077668106157464296424716088"


自贡黄明儒 发表于 2022-10-8 16:35:00

本帖最后由 自贡黄明儒 于 2022-10-9 15:40 编辑

对于最大整数,我终于知道了。2的31次方2147483648,是分界线

baitang36 发表于 2022-10-8 17:00:46

aeo000000 发表于 2022-10-8 16:09
不可能有更大整数,再大就必须变成浮点的
错,你在64位acad的命令行输入 !princ,看看返回什么?一个64位整数,它的类型是INT,是整数

aeo000000 发表于 2022-10-8 20:19:06

baitang36 发表于 2022-10-8 17:00
错,你在64位acad的命令行输入 !princ,看看返回什么?一个64位整数,它的类型是INT,是整数

命令: (setq h 2147483649)
2.14748e+09
命令: (type h)
REAL

aeo000000 发表于 2022-10-8 20:23:03

本帖最后由 aeo000000 于 2022-10-8 20:26 编辑

命令: (setq h 2147483649)
2.14748e+09
命令: (type h)
REAL
命令: (setq y 2147483647)
2147483647
命令: (type y)
INT
已经很不错了,以前的版本,超过直接砍断,为了这,没少出错。现在的版本自动变成real,已经非常牛的了


你看一下我的注册时间。
lisp的历史还是知道一点的

baitang36 发表于 2022-10-8 20:34:34

本帖最后由 baitang36 于 2022-10-8 20:35 编辑

aeo000000 发表于 2022-10-8 20:23
命令: (setq h 2147483649)
2.14748e+09
命令: (type h)
你试试这个?
命令: (load "c:/00/trf_9.fas")
命令: (tranf "_addr-of")
T
命令: (_addr-of princ)
2095471388416
命令: (setq a(_addr-of princ))
2095471388416
命令: (type a)
INT
命令: !a
2095471388416

mokson 发表于 2022-10-9 08:16:03

CAD太弱了,表达一个22亿或以上的整数,都做不到。

baitang36 发表于 2022-10-9 13:45:14

aeo000000 发表于 2022-10-8 20:23
命令: (setq h 2147483649)
2.14748e+09
命令: (type h)


你是真正的元老,注册这么早啊?失敬了
页: [1] 2
查看完整版本: AutoLisp中的整数研究