17

javascriptで数値を型キャストする方法は?

a = (unsigned int)atoi(arg1);
b = (unsigned int)atoi(arg2);

a と b が署名できると仮定します。

4 バイトの符号付き整数を 4 バイトの符号なし整数に変換したいと考えています。

JavaScript には、型キャストや符号付き/符号なしなどがないことを私は知っています。わかりやすいアルゴリズムを探しています。

4

4 に答える 4

43

を試すことはできa = arg1>>>0ますが、探していることがうまくいくかどうかはわかりません。

詳細については、この質問を参照してください。

于 2013-02-15T09:03:35.920 に答える
15

あなたも使うことができます

(new Uint32Array([arg1]))[0]

例えば

< (new Uint32Array([-1]))[0]
> 4294967295

説明: JavaScript は、C のような従来のマシン アーキテクチャの整数キャスト規則には従わず、低レベルの効率よりも型の単純さと移植性を優先します。ただし、JavaScript の型付き配列 (Uint8Array など) は、特に効率的で明確に定義されたマルチバイトおよびビットレベルの操作を目的として追加されました。したがって、この事実を利用して、明確に定義された組み込みのビットキャスト操作にアクセスできます。上記の例の構文:

  1. 入力の自然数配列を作成します
  2. その数値から型付き配列 (Uint32Array) を構築します。ここでキャストが発生します。
  3. キャスト結果を含む、その型付き配列の最初 (0 番目) の要素を抽出します。
于 2014-10-23T20:57:38.677 に答える
3

Javascript のすべての (プリミティブ) 数値は IEEE748 double であり、52 ビットの整数精度が得られます。

符号付きと符号なしの問題は、数値を 32 ビットの符号付き>>>数値に変換する以外のすべての Javascript ビット演算子が、最下位の 32 ビットを取り、残りを破棄し、結果のビット 31 が次のようになることです。署名された結果を与えるために拡張された署名。

既知の 4 つのバイト値から始める場合は、単純な乗算と加算を代わりに使用することで、ビット単位の演算子の問題を回避できます。これは整数精度の 52 ビットすべてを使用します。

var a = [ 1, 2, 3, 4];  // 0x01020304
var unsigned = a[0] * (1 << 24) + a[1] * (1 << 16) + a[2] * (1 << 8) + a[3]
于 2013-02-15T09:14:54.797 に答える