問題タブ [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.
c - 符号付き右シフト = 奇妙な結果?
私は誰かの宿題を手伝っていて、この奇妙な問題に遭遇しました。問題は、符号付き整数のバイトの順序を逆にする関数を作成することです (とにかく関数が指定された方法です)。これが私が思いついた解決策です:
この関数に渡す0xFF000000
と、最初の代入は になり0xFFFFFFFF
ます。何が起こっているのかよくわかりませんが、署名付きと未署名の間の変換、またはそのようなものと関係があることは知っています。
追加ul
すると正常に0xFF
動作します。これは、強制的に署名なしに変換されてから、署名付きまたはその方向の何かに変換されるためだと思います。結果のコードも変更されます。指定子がないul
場合は sar(算術右シフト) を使用しますが、符号なしでは意図したとおりに shr を使用します。
誰かが私のためにこれに光を当てることができれば、本当に感謝しています。私はこのことを知っているはずであり、知っていると思っていましたが、ここで何が起こっているのか本当にわかりません.
前もって感謝します!
assembly - 署名付き/未署名のロードおよびストア命令 (MIPS) に関する明確化
Google の助けを借りて教科書を手にしても、これらの概念を理解できないようです。
フォーマット(opcode、rs、rt、offset)に従って...
- アドレスの値に追加する前に、オフセットを符号拡張しますか? それとも拡張する前に追加しますか?
- lbとlbuの場合、違いは何ですか? また、「符号なし」はオーバーフローを報告しないことを意味するという MIPS 算術定義にも従っていますか?
- lwに署名されていないバージョンがないのはなぜですか? お店の説明書にも記載がない…
assembly - movzwl、%ax、および負の値による奇妙な結果
さて、私は次のコードスニペットを扱っています:
したがって、正の値を扱う場合、これは期待どおりに動作します。%edx にコピーされる値は、%eax (または %ax) の末尾の 16 ビットです。
ただし、負の数を入れると、すべてがおかしくなり始め、期待どおりに動作していないように見えます。
たとえば、%eax の値が -67043552 の場合、%edx にコピーされる値は 65312 です。
組み立て初心者ですので、私の勘違いでしたら申し訳ありません。どんな助けでも大歓迎です。
assembly - アセンブリ言語:cbw
cbw
コマンドが実際に何をするのかわかりません。コードのスニペットがあります:
cbw後にaxの値はどのように変化しますか?
c - 符号拡張の必要性とは?
次のCコードを検討してください-
それには-
- 2 番目のパラメーターを符号拡張に変換します。
- 署名された拡張パラメーターを b としてスタックにプッシュします。
- 最初のパラメーターを符号拡張に変換します。
- 署名された拡張パラメーターを a としてスタックにプッシュします。
- a&bを足して、結果をcharにキャストしてcに格納する。
- C は再び符号拡張されます。
- 符号拡張された c は戻り値レジスタにコピーされ、関数は呼び出し元に戻ります。
- 結果の呼び出し元関数を再度格納するには、int を char に変換します。
私の質問は -
- 誰がこれをしますか?
- そんなに多くの変換を行う必要性は何ですか?
- マシン/コンパイラのパフォーマンスを低下/向上させますか?
- パフォーマンスが低下している場合、パフォーマンスを向上させるにはどうすればよいですか?
constants - MIPS で符号拡張定数をシフトする
MIPS の分岐命令で符号拡張された 16 ビット定数を 2 シフトするのはなぜですか? 私はこの考えに混乱しています。このシフトは、符号拡張された 16 ビット定数にどのような利点をもたらしますか。ここに写真があります:
よろしく
c++ - sprintf で 16 進数値を表示するポータブルな方法
バイナリから (印刷可能な) ヘキサへの変換で問題が発生しました。コードを書くための(私のシステムにとって)機能的な方法に達しましたが、それがすべてのシステム(OSとハードウェア)で移植可能かどうかを知る必要があります。
これが私の関数です(バイナリテキストからUUIDを構築しようとしています):
unsigned charの代わりにcharを使用すると、符号拡張のために値がうまく出力されないことを理解しました(C++はバイナリファイルを読み取り、hexに変換します)。それぞれ承認および変更されました。
しかし、私はこれを行うより多くの変種に遭遇しました: Conversion from binary file to hex in C、そして私は本当に迷っています。アンワインドのコードでは:
配列が unsigned char であるにもかかわらず (質問をした人によって元の投稿コードで定義されているように)、unsigned intへのキャストが必要であり、変換するバイトのビットごとの ANDが必要な理由がわかりませんでした...
符号拡張のことをよく理解していなかったので、少なくとも私が書いたコードがすべてのシステムで動作するかどうか教えていただけますか?
c++ - 間違った符号拡張 c++/qt
デスクトップ x64 Intel アーキテクチャ (gcc コンパイラ、linux) と RaspberryPi Arm (gcc クロス コンパイラ) で次のコードを実行しています。
refはQByteArrayです。
quint32 (unsigned int) をキャストしたにもかかわらず、指定されたバイトが負の数の場合、私の PC はエラーを引き起こす符号拡張を行うことに気付きました。私のコードは Arm で問題なく動作します。なぜこれが起こるのですか?キャストはこれを防ぐべきだと思いました。そうじゃない?
分解:
また、コンパイラが char の代わりに QByteRef の戻り値を使用していることにも気付きました。しかし、それは私が推測するエラーを引き起こすべきではありません。
QByteArrayヘルプページから:
前もって感謝します