14

MIPS で符号なし整数を操作しようとすると、実行するすべての操作が符号なしの操作であるにもかかわらず、実行するすべての操作の結果は符号付きのままになります (つまり、整数はすべて 2 の補数になりますaddu) multu

範囲内の数値を出力すると、[2^31, 2^32 - 1]署名されているかのように「オーバーフローした」負の値が得られます(署名されていると思います)。

ただし、次のようなことを試すと:

li $v0, 1
li $a0, 2147483648                # or any bigger number
syscall

印刷された番号は常に2147483647 (2^31 - 1)

私は混乱しています...何が欠けていますか?

PS:コードはあまり読みにくいため(アセンブリコードなど)、含めていません。この問題はさておき、問題なく動作しているようです。誰かが必要だと感じたら、すぐに含めます!

4

2 に答える 2

21

ウィキペディアから:

MIPS32命令セットは、加算および減算命令の一部として署名されていない単語が誤った名称であると述べています。符号付きバージョンと符号なしバージョンのコマンドの違いは、オペランドの符号拡張(またはその欠如)ではありませんが、オーバーフロー時にトラップを実行するか(Addなど)、オーバーフローを無視するか(Add unsigned)を制御します。これらの命令のイミディエートオペランドCONSTは、常に符号拡張されます。

MIPS命令リファレンスから:

すべての算術即値は符号拡張されます[...]符号付き命令と符号なし命令の唯一の違いは、符号付き命令はオーバーフロー例外を生成でき、符号なし命令は生成できないことです。

于 2009-12-29T20:48:32.833 に答える
2

本当の問題は、数字を出力するために使用しているシステムコールであるように私には思えます。渡されたものを常に署名付きとして解釈し、おそらくバインドするように見えます。

于 2009-12-30T00:18:08.260 に答える