• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            戰(zhàn)魂小筑

            討論群:309800774 知乎關(guān)注:http://zhihu.com/people/sunicdavy 開(kāi)源項(xiàng)目:https://github.com/davyxu

               :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              257 隨筆 :: 0 文章 :: 506 評(píng)論 :: 0 Trackbacks

            前面一片文章中l(wèi)ua出現(xiàn)的bug,其實(shí)是lua本身結(jié)構(gòu)問(wèn)題導(dǎo)致的:

            lua中,數(shù)值使用double來(lái)存儲(chǔ),包含整形和double。而解析出來(lái)的整形也是被強(qiáng)轉(zhuǎn)為double進(jìn)行存儲(chǔ),這樣就會(huì)出問(wèn)題。

            舉一個(gè)簡(jiǎn)單的例子:

            double f = (double)0xffffffff;
            int a = int(f);

            a肯定不是-1

            這里的文章說(shuō)明這個(gè)類型轉(zhuǎn)換問(wèn)題的緣由。

             

            Squirrel腳本中就不會(huì)有這個(gè)問(wèn)題

            local a = 0xffffffff

            print( a )

            結(jié)果為-1

            查看其源代碼:

            typedef union tagSQObjectValue
            {
                struct SQTable *pTable;
                struct SQArray *pArray;
                struct SQClosure *pClosure;
                struct SQGenerator *pGenerator;
                struct SQNativeClosure *pNativeClosure;
                struct SQString *pString;
                struct SQUserData *pUserData;
                SQInteger nInteger;
                SQFloat fFloat;
                SQUserPointer pUserPointer;
                struct SQFunctionProto *pFunctionProto;
                struct SQRefCounted *pRefCounted;
                struct SQDelegable *pDelegable;
                struct SQVM *pThread;
                struct SQClass *pClass;
                struct SQInstance *pInstance;
                struct SQWeakRef *pWeakRef;
                SQRawObjectVal raw;
            }SQObjectValue;

             

            可以看到

            SQInteger nInteger;
            SQFloat fFloat;

            是分開(kāi)存儲(chǔ)的,因此就不會(huì)有這個(gè)問(wèn)題

             

            lua解決方法:

            1. 將十六進(jìn)制換為10進(jìn)制存儲(chǔ)

            2. 等待大俠或者官方修改代碼,做出patch


            評(píng)論

            # re: Lua腳本浮點(diǎn)轉(zhuǎn)整形bug分析 2010-02-04 14:02 LOGOS
            兩者是不同的
            1 ->
            int i = 0xFFFFFFFF;
            double d = (double)i; // d = -1
            int a = (int)d; // a = -1

            2 ->
            double d = (double)0xFFFFFFFF; // d = 4294967295
            int a = (int)d; // a overflow  回復(fù)  更多評(píng)論
              

            # re: Lua腳本浮點(diǎn)轉(zhuǎn)整形bug分析 2010-02-04 14:28 LOGOS
            lua_pushinteger(L, ptrdiff_t)
            第二個(gè)參數(shù)是ptrdiff_t,不是int
            我比較感興趣你是在什么平臺(tái)下編譯的,32位?64位?
            編譯器是什么,VC?gcc?  回復(fù)  更多評(píng)論
              

            # re: Lua腳本浮點(diǎn)轉(zhuǎn)整形bug分析 2010-02-04 17:34 Davy.xu
            @LOGOS

            VC,32位
              回復(fù)  更多評(píng)論
              

            # re: Lua腳本浮點(diǎn)轉(zhuǎn)整形bug分析 2010-02-04 17:47 黃路易
            我懷疑是你的lua嵌入代碼或者編譯環(huán)境的問(wèn)題,因?yàn)樵诩僱ua的命令行中沒(méi)有你上一篇文章的問(wèn)題,或者你看看我寫(xiě)的這篇?
            http://www.hlouis.com/develop/lua-cant-do-math/
            不知道有沒(méi)有幫助  回復(fù)  更多評(píng)論
              

            # re: Lua腳本浮點(diǎn)轉(zhuǎn)整形bug分析 2010-02-04 17:58 LOGOS
            @黃路易
            可能是優(yōu)化問(wèn)題
            把lua_pushinteger((double)(int)0xFFFFFFFF)
            優(yōu)化成了
            lua_pushinteger((double)0xFFFFFFFF)

            Davy跟一下匯編,然后貼出來(lái)看看  回復(fù)  更多評(píng)論
              

            # re: Lua腳本浮點(diǎn)轉(zhuǎn)整形bug分析 2010-02-04 19:14 Davy.xu
            @黃路易
            在lua虛擬機(jī)內(nèi)部的數(shù)字,和你用print打出來(lái)都是“貌似"對(duì)的
            這個(gè)問(wèn)題,我朋友項(xiàng)目也發(fā)生過(guò),做法就是全用整數(shù)  回復(fù)  更多評(píng)論
              

            # re: Lua腳本浮點(diǎn)轉(zhuǎn)整形bug分析 2010-02-04 19:18 Davy.xu
            @LOGOS
            你的這段代碼我試過(guò),不管用的
            我現(xiàn)在工程里已經(jīng)解決這個(gè)問(wèn)題,還是得用整數(shù),就是看起來(lái)非十六進(jìn)制的顏色很惡心
              回復(fù)  更多評(píng)論
              

            # re: Lua腳本浮點(diǎn)轉(zhuǎn)整形bug分析 2010-02-22 14:11 Quon
            這個(gè)問(wèn)題的原因是DirectX修改了系統(tǒng)行為強(qiáng)制把浮點(diǎn)數(shù)定為單精度,造成lua整型的范圍變小了  回復(fù)  更多評(píng)論
              

            # re: Lua腳本浮點(diǎn)轉(zhuǎn)整形bug分析 2010-02-23 08:56 Davy.xu
            @Quon
            這個(gè)例子中并沒(méi)有使用到DX  回復(fù)  更多評(píng)論
              

            久久夜色精品国产| 久久久久国产日韩精品网站| 久久久久亚洲av毛片大| 国产精品99久久久久久猫咪| 久久人妻少妇嫩草AV蜜桃| 综合网日日天干夜夜久久 | 无码任你躁久久久久久| 久久久久se色偷偷亚洲精品av| 狠狠色丁香久久综合五月| 欧美亚洲国产精品久久| 97久久超碰成人精品网站| 久久久久亚洲AV无码去区首| 久久精品中文无码资源站| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 久久国产精品国语对白| 久久永久免费人妻精品下载| 久久毛片免费看一区二区三区| 97久久精品国产精品青草| 久久精品久久久久观看99水蜜桃| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 久久久久亚洲av无码专区喷水 | 久久亚洲欧洲国产综合| 97久久精品午夜一区二区| 亚洲精品无码专区久久久| 无码人妻久久一区二区三区蜜桃 | 一本久久精品一区二区| 久久精品一区二区三区中文字幕| 亚洲色大成网站www久久九| 久久综合色区| 国产精品久久久久一区二区三区| 国产∨亚洲V天堂无码久久久| 久久精品无码一区二区三区免费| 99久久国产热无码精品免费久久久久| 久久人爽人人爽人人片AV| 久久99精品国产麻豆宅宅| 久久精品国产免费观看| 日本五月天婷久久网站| 777午夜精品久久av蜜臀| 久久香综合精品久久伊人| 欧美噜噜久久久XXX| 99999久久久久久亚洲|