以下は動作することが保証されていますか、または実装が定義されていますか?
unsigned int a = 4294967294;
signed int b = a;
の値b
は-2
gcc にあります。
C99 から (§6.3.1.3/3) それ以外の場合、新しい型は署名され、値を表現できません。結果が実装定義であるか、実装定義のシグナルが発生します。
a
値の変換signed int
は実装定義です(6.3.1.3p3のために正しく言及したように)。たとえば、一部のシステムでは、INT_MAX
(飽和変換) の可能性があります。
実装の動作についてgcc
は、次のように定義されています。
値をその型のオブジェクトで表すことができない場合に、整数を符号付き整数型に変換した結果、またはそれによって生成されたシグナル (C90 6.2.1.2、C99 6.3.1.3)。
幅 N の型への変換の場合、値は型の範囲内になるように 2^N を法として減らされます。信号は発生しません。
http://gcc.gnu.org/onlinedocs/gcc/Integers-implementation.html