問題タブ [sign-extension]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
15083 参照

assembly - いつ、なぜ、extend に署名し、mul/div で cdq を使用するのですか?

今日テストを受けましたが、ダブルワードをクワッドワードに変換する問題だけが理解できませんでした。

なぜ/いつ乗算または除算の拡張に署名するのですか? また、cdq などの命令はいつ使用するのでしょうか。

0 投票する
1 に答える
20278 参照

assembly - アセンブリ cltq と movslq の違い

Computer Systems A Programmer's Perspective (2nd Edition)の第 3 章では、
cltqと同等であると言及していmovslq %eax, %raxます。

cltq単に使用するのではなく、なぜ新しい命令 ( ) を作成したのmovslq %eax,%raxですか? それは冗長ではありませんか?

0 投票する
7 に答える
4471 参照

c++ - 符号付きオペランドと符号なしオペランドを使用したビット単位の「&」

正しいオペランドの型に応じて異なる結果が得られるという興味深いシナリオに直面しましたが、その理由がよくわかりません。

最小限のコードは次のとおりです。

Linux 64 ビットで g++ (gcc バージョン 4.5.2) を使用してこのコードをコンパイルしました: g++ -std=c++0x -Wall example.cpp -o example

出力は次のとおりです。

ffffffff81230000

81230000

最初のケースでの出力の理由がよくわかりません。

ある時点で、一時的な計算結果のいずれかが符号付き 64 ビット値 ( )に昇格さint64_tれ、符号が拡張されるのはなぜですか?

最初に 16 ビット値が 16 ビット左にシフトされ、次に 64 ビット値に昇格された場合、どちらの場合も「0」の結果を受け入れます。checkコンパイラが最初にtoをプロモートしてからuint64_t他の操作を実行する場合、2 番目の出力も受け入れます。

しかし、どうして&0xFFFF ( int32_t) と 0xFFFFU ( uint32_t) を比較すると、これら 2 つの異なる出力になるのでしょうか?

0 投票する
2 に答える
1118 参照

python - Python でのビット フィールドの特殊化

C++ のコードは次のとおりです。

このコードの出力は -3 です。このコードを Python で再現しようとすると、11101 のビット フィールドが生成されますが、答えが int に変換されると、29 の答えが与えられます。

以下はpythonのコードです:

また、代替コードとして ctypes 構造を使用しましたが、使用しませんでした:

私の質問は、ビット配列または正しい答えを与える他の方法を使用して、この結果をどのように生成するかということです。

0 投票する
3 に答える
10252 参照

assembly - 負の即値定数を持つ MIPS の andi 命令と addi 命令

$t2= と仮定0x55555550して、次の命令を実行します。

$t2 は0x0005550

これは MIPS エミュレーター1で確認されています。

しかし、それは私が期待したものではありません。答えは 0x55555550 & 0xFFFFFFFF = 0x55555550 であるべきだと思います。and ロジックの前に、定数 -1 が 0xFFFFFFFF に符号拡張されたと思います。しかし、答えは 0x55555550 & 0x0000FFFF だったようです

-1 が 0xFFFFFFFF ではなく 0x0000FFFF に符号拡張される理由


脚注 1: 編集者注: 「拡張疑似命令」が有効になっている MARS は、これを複数の命令に展開し0xffffffffて tmp レジスタに生成するため、変更され$t2ません。そうしないと、MARS と SPIM の両方が、エンコードできないとしてエラーで拒否します。他のアセンブラは異なる場合があります。

0 投票する
7 に答える
4518 参照

c++ - C++ での 24 ビットから 32 ビットへの符号付き拡張

別々に送信される 3 つの符号なしバイトがあります。

これらを符号付き 32 ビット値に変換する必要がありますが、負の値の符号を処理する方法がよくわかりません。

int32 の上位 3 バイトにバイトをコピーしてから、すべてを右にシフトすることを考えましたが、予期しない動作が発生する可能性があることを読みました。

これを処理する簡単な方法はありますか?

表現は 2 の補数を使用しています。