SO に関する回答から、JavaScript は OS とブラウザ間で特定のエンディアン エンコーディングを保証するのでしょうか?
または別の言い方をすれば、JavaScript では整数のビット単位のシフトは「安全」ですか?
SO に関する回答から、JavaScript は OS とブラウザ間で特定のエンディアン エンコーディングを保証するのでしょうか?
または別の言い方をすれば、JavaScript では整数のビット単位のシフトは「安全」ですか?
シフトは安全ですが、エンディアンはビットシフト操作に影響しないため、質問には欠陥があります。左へのシフトは、すべての言語のビッグ エンディアン システムとリトル エンディアン システムで同じです。(右へのシフトは異なる場合がありますが、ビットの相対位置ではなく、符号ビットの解釈によるものです。)
エンディアンは、メモリの一部のブロックをバイトまたはより大きな整数値として解釈するオプションがある場合にのみ機能します。一般に、Javascript では、任意のメモリ ブロック、特に変数が占有するメモリ ブロックにはアクセスできないため、そのオプションは提供されません。型付き配列は、エンディアンに依存する方法でデータのビューを提供しますが、順序はホスト システムによって異なります。すべての可能な Javascript ホスト環境で必ずしも同じであるとは限りません。
エンディアンは、論理ストレージの順序ではなく、物理ストレージの順序を表します。論理的には、右端のビットは常に最下位ビットです。そのビットのバイトが最下位のメモリ アドレスに存在するかどうかは、まったく別の問題であり、言語が「最下位のメモリ アドレス」などの概念を公開している場合にのみ問題になりますが、Javascript にはありません。型付き配列はそうしますが、型付き配列のコンテキスト内でのみです。彼らはまだ任意のデータのストレージへのアクセスを提供していません.
型付き配列を使用する場合、エンディアンが関連する可能性があるため、これらの回答の一部は日付が付けられています! 検討:
var arr32 = new Uint32Array(1);
var arr8 = new Uint8Array(arr32.buffer);
arr32[0] = 255;
console.log(arr8[0], arr8[1], arr8[2], arr8[3]);
これを Chrome のコンソールで実行すると、 が生成255 0 0 0
され、マシンがリトル エンディアンであることを示します。ただし、型付き配列はデフォルトでシステムのエンディアンを使用する0 0 0 255
ため、マシンがビッグ エンディアンである場合は代わりに表示される場合があります。
はい、安全です。JS ビット操作は「ハック」であるため、期待する速度の利点は得られませんが。
ECMA スクリプトには実際には整数型の概念がありますが、必要に応じて倍精度浮動小数点値との間で暗黙的に強制変換されます (表される数値が大きすぎる場合、または小数部分がある場合)。
多くの主流の Javascript インタープリター (SpiderMonkey がその例です) は、実装を簡略化し、すべての数値を double として解釈して、各命令の値の実際のネイティブ型をチェックしないようにしています。実装ハックの結果、ビット操作は整数型へのキャストとして実装され、その後 double 表現へのキャストバックが続きます。したがって、Javascript でビットレベルの操作を使用することはお勧めできません。とにかくパフォーマンスを向上させることはできません。
JavaScriptで整数のビットごとのシフトは「安全」ですか?
32 ビット (31+符号) に収まる整数のみ。たとえば、Python とは異なり、1<<40 を取得することはできません。
これは、JavaScript の数値が実際には浮動小数点数であっても、ビット演算子が ECMA-262 で機能するように定義されている方法です。(技術的には、倍精度浮動小数点数で 52 ビットの仮数が得られ、32 ビット整数の範囲を簡単にカバーできます。)
ビット単位の算術演算に関連する「エンディアン」の問題はなく、エンディアンが関与する可能性のあるバイト格納形式は JavaScript に組み込まれていません。
JavaScript には整数型はなく、浮動小数点型しかありません。これについて心配するほど実装の詳細に近づくことはできません。