Javascript 的 64bit Int 支持

jopen 9年前發布 | 15K 次閱讀 JavaScript開發 JavaScript

 

最近把一個 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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!