Javascript 的 64bit Int 支持
最近把一個 native 游戲移植到 HTML5,客戶端和服務端都是 C++ ,而且游戲金幣經常性超過2^31,所以服務端的大爺們很任性地使用了 int64 。
這下問題來了,Javascript 不支持 int64 。
說服服務端的大爺們改用 32bit 是不可能的。說服大爺們使用字符串也是不可能的。說服策劃重新設置數值使其小于2^31也是不可能的。
有句話怎么說的?如果不能反抗,那就默默享受吧……
看我這個 Javascript 前端菜鳥如何應對!
本著不重復(tou)造輪(lan)子的優良傳統,我發現了這樣幾個已有的實現方案:
2個uint 拼接
lizi 這位比我還懶的程序員同學實現的 方法 ,這酸爽……
package lz.jprotoc { import flash.utils.IDataInput; /** * ... * @author lizhi http://matrix3d.github.io/ */ public class Int64 { public var low:uint = 0; public var high:uint = 0; public function Int64(low:uint=0,high:uint=0) { this.low = low; this.high = high; } public function equal(v:Int64):Boolean { if (v == null) return false; return (v.low == low) && (v.high == high); } public function isZero():Boolean { return low == 0 && high == 0; } public function toString():String { return "high:0x" + high.toString(16)+" low:0x" + low.toString(16); } } }
雖然是 AS3 寫的,但轉成 JS 也是分分鐘。
字符串拼接法
dom 同學用 ByteArray 來保存每個字節 (同樣是 AS3),然后將其轉成字符串來顯示,缺點和上面 lizi 的一樣,就是無法計算。
node-int64
node-int64 采用 Javascript 的 Number 來實現對超過 int32 的數值的保存。由于 Number 采用 雙精度浮點數 來保存數值,因此該值的范圍只能在+/- 2^^53的范圍內。
這是我最終的選擇。因為金幣的值在客戶端是會參與計算的,但估計在游戲的有生之年都不可能大于2^53。
(全文完)
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!