質問

だ実行には、下記コードC

#include <stdint.h>

uint16_t a = 4000;
uint16_t b = 8000;

int32_t c = a - b;

printf("%d", c);

で正しく印刷'-4000としての結果です。しかし、私は少し混乱して:ながされる演算のオーバーフローの場合を差し引いたより大きな符号なし整数から。どの鋳造のルールで遊ぶ。この質問のように見えるビットnoobishおり、いず参照のうぞよろしくお願い申し上げます。

役に立ちましたか?

解決

問題は、実際には多少複雑です。算術式のオペランドは、あなたがのセクション3.2.1.5で見ることができる特定のルールを使用して変換され、標準(C89)の。あなたのケースでは、答えはタイプuint16_tが何であるかに依存します。それはintよりも小さい場合、short intは、その後、オペランドがintに変換され、あなたが-4000を得るが、16ビットシステム上で、uint16_tunsigned intすることができ、signed型への変換が自動的に行われないだろうと言っています。

他のヒント

その答えはこれらのすべてに昇格 int の減算.の答えは、部6.3.1.1の C標準規格, いつ の整数を促進 算数科における表現です。関連する言語の標準:

の場合 int を表現できるすべての値の のオリジナルタイプでは、この値は に変換され int;それ以外の場合は、 に変換され unsigned int.これらの というの の整数を促進.他のすべての種類の変更による 整数型セールスプロモーション

詳細は、そこでは、あまりにも、その取得しか起きる。

両方のオペランドは、減算時int32_tに昇格されています。結果はint32_tの最大値よりも大きくなっていた場合は、オーバーフローを見ただろう。

オーバーフローが、実際には、ありますが、Cはあなたを教えてくれません。

オーバーフローは符号付き整数として解釈するとき-4000であることを起こる値を残します。 2の補数のマシン上で設計されたので、これは動作します。

符号なしとして結果を解釈しようと、あなたは(U1-U2)は、いくつかの一見無関係に見える数際U1 と評価されたことに気づくでしょう

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top