11
main()  {   
  if ( -1 < (unsigned char) 1 )
    printf("less than");
  else        
    printf("NOT less than");
} 

プリントしless thanます。(unsigned char) 1 は、に変換されてから (signed char) 1:に変換されるため、(signed) -1 < (signed) 1出力は。になりますless than

しかし、上記のコードを次のように変更するとif ( (-1 < (unsigned int) 1 )

その場合、出力はNOT less thanです。

したがって、unsignedcharをunsignedintに変更すると、次のようになります。

  • (signed)-1はunsignedintに変換されます[正反対のことが起こっています]
  • -1は2の1の補数として格納されるため。ビットパターンは255と評価されます(おそらく)
  • したがって、255 <1はfalseと評価され、それ以外の場合は実行されます。
  • int a = -1;'-1'の代わりに置き換えても同じ結果

質問:

  1. 符号付きおよび符号なし演算中...符号付きが符号なしに変換されるか、またはその逆になるかを確認する方法。

  2. unsigned charとcharの間で算術演算の変換が異なるのはなぜですか:明らかにunsignedはsignedとunsigned intに変換され、int:明らかにsignedはunsignedに変換されます

PS:これはコンパイラに依存しないことを私は知っています。だからそうは言わないでください。

4

2 に答える 2

10

ルールは次のとおりです。

6.3.1.8通常の算術変換

..。

それ以外の場合、整数拡張は両方のオペランドで実行されます。次に、プロモートされたオペランドに次のルールが適用されます。

  1. 両方のオペランドのタイプが同じである場合、それ以上の変換は必要ありません。
  2. それ以外の場合、両方のオペランドが符号付き整数型であるか、両方が符号なし整数型である場合、整数変換ランクの低いタイプのオペランドは、ランクの高いオペランドのタイプに変換されます。
  3. それ以外の場合、符号なし整数型のオペランドのランクが他のオペランドの型のランク以上の場合、符号付き整数型のオペランドは符号なし整数型のオペランドの型に変換されます。
  4. それ以外の場合、符号付き整数型のオペランドの型が符号なし整数型のオペランドの型のすべての値を表すことができる場合、符号なし整数型のオペランドは符号付き整数型のオペランドの型に変換されます。
  5. それ以外の場合は、両方のオペランドが、符号付き整数型のオペランドの型に対応する符号なし整数型に変換されます。

ルールは次のように機能します。

  • -1 < (unsigned char) 1

最初に、両方のオペランドがintに変換されます(intはunsigned charのすべての値を表すことができるため)。次に、これらの署名されたタイプで比較が行われます。次に、ルール1が使用されます。比較は成功します。

  • -1 < (unsigned int) 1

intはunsignedintのすべての値を表すことはできないため、ルール3が使用され、符号付き整数が符号なし整数(UINT_MAX-1)に変換されます。比較は失敗します。

于 2010-10-10T13:08:09.130 に答える
1

これは整数プロモーションによるものです。両方の引数はintとして表すことができるため、intに変換されます。

ISO C 6.3.1.1、パラグラフ2:

intが元の型のすべての値を表すことができる場合、値はintに変換されます。それ以外の場合は、unsignedintに変換されます。これらは整数プロモーションと呼ばれます。48)他のすべてのタイプは整数プロモーションによって変更されません。

于 2010-10-10T13:47:26.863 に答える