10

質問Bitshift と整数の昇格に似ていますか? 、左ビットシフトを使用する場合の整数昇格について質問があります。

unsigned int test(void)
{
  unsigned char value8;
  unsigned int result;

  value8 = 0x12;
  result = value8 << 8;
  return result;
}

この場合、value8 は最初に unsiged int にプロモートされますか、それとも実装固有ですか?

6.5.7 ビット単位のシフト演算子... 3 セマティクス ...
整数昇格は各オペランドで実行されます。結果の型は、昇格された左オペランドの型です。右オペランドの値が負の値であるか、プロモートされた左オペランドの幅以上である場合、動作は未定義です。

「整数の昇格は各オペランドで実行されます」と書かれています。、しかし、ここで昇格ルールは何ですか?

あるべきだとconvert to int if lesser rank than int思いますが、見つかりません。

1 つのコンパイラ (Renesas nc30wa) は int に昇格しないので、これを尋ねます。そのため、私のサンプルでは結果は常に 0 です。

このプラットフォームでは、char は幅 8 ビット、int は 16 ビットです。

4

2 に答える 2

16

「整数プロモーション」というフレーズは、(C99 の場合) セクションにある非常に6.3.1.1 Booleans, characters, and integers具体的なものです。

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

unsigned charしたがって、あなたが に保持できると仮定するintと、 に昇格しますintunsigned charがと同じ幅のまれなプラットフォームではint、 に昇格しますunsigned int

これは C11 でわずかに変更されただけです。

が元の型のすべての値を表すことができる場合int(ビットフィールドの場合、幅によって制限されるため)、値はint;に変換されます。それ以外の場合は、に変換されますunsigned int。これらは整数プロモーションと呼ばれます。他のすべての型は、整数の昇格によって変更されません。

特定のコンパイラがこの動作に従わない場合、実際には準拠していません。ただし、リストしたコンパイラが組み込みシステム用であることを考えると、それほど驚くことではありません。

多くは特定の目的のために構築されており、適合性は要件リストの上位にあるとは限りません。より厳密に標準に準拠できるようにするコンパイラ フラグがある場合があります。


特定の環境を見るとM16C Series,R8C Family C Compiler Package V.5.45 C Compiler、セクション2.1.4 nc30 Command Line Options、サブセクションに次のようなものがありf. Generated code modification optionsます。

-fextend_to_int, -fETI:char型のデータを型に拡張して演算を行いますint。ANSI 標準に従って拡張されています。

ただし-fansi、他のいくつかのこともカバーしているため、おそらくより良い選択だと思います。

于 2012-06-26T08:07:28.880 に答える
3

value8のコンバージョン ランクが のコンバージョン ランクよりも低いintと仮定すると、は に昇格します (通常、ほとんどのプラットフォームの場合)。unsigned charint

整数の変換ランクは、6.3.1.1 の C99 で説明されています。

一部のコンパイラは、デフォルトで整数昇格規則を無効にすることに注意してください。たとえば、MicroChip コンパイラ MPLAB C18 です。コンパイラのドキュメントで ISO 準拠を探します。

于 2012-06-26T08:06:19.400 に答える