C整数オーバーフローの行動を割り当てる際に大きな幅の整数
-
05-09-2019 - |
質問
だ実行には、下記コード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_t
がunsigned int
することができ、signed型への変換が自動的に行われないだろうと言っています。
他のヒント
その答えはこれらのすべてに昇格 int
の減算.の答えは、部6.3.1.1の C標準規格, いつ の整数を促進 算数科における表現です。関連する言語の標準:
の場合
int
を表現できるすべての値の のオリジナルタイプでは、この値は に変換されint
;それ以外の場合は、 に変換されunsigned int
.これらの というの の整数を促進.他のすべての種類の変更による 整数型セールスプロモーション
詳細は、そこでは、あまりにも、その取得しか起きる。
両方のオペランドは、減算時int32_t
に昇格されています。結果はint32_t
の最大値よりも大きくなっていた場合は、オーバーフローを見ただろう。
オーバーフローが、実際には、ありますが、Cはあなたを教えてくれません。
オーバーフローは符号付き整数として解釈するとき-4000であることを起こる値を残します。 2の補数のマシン上で設計されたので、これは動作します。
符号なしとして結果を解釈しようと、あなたは(U1-U2)は、いくつかの一見無関係に見える数際U1