2011-07-09 3 views
6

は、私は次のシナリオを考えてみましょう:Cで異なるデータ型を比較す​​る一般的なルールは何ですか?

int i = 10; 
short s = 5; 

if (s == i){ 
    do stuff... 
} else if (s < i) { 
    do stuff... 
} 

Cは、それがint型への短絡この場合には、より小さいデータ型を変換しない比較を行うか、それがデータ型に右にデータ型を変換しない場合左に? この場合はintを短くしますか?

+3

Cでは、原則として*しないでください*。しかし、あなたの例では 'short'は' int'に昇格します。 –

答えて

8

これは、通常の算術変換の適用を受けます。単純な場合、一般的な経験則では、「より小さい」精度のタイプは「より多く」の精度でタイプにマッチするように変換されますが、signedunsignedの混合を開始するとやや複雑になります。 C99では

、これは私はあなたの便宜のためにここに含まれるセクション6.3.1.8で説明されています。いずれかのオペランドの対応する実数型がlong double、 他のオペランドである場合、

  • ファースト対応する実数型が long doubleである 型に、型ドメインを変更することなく に変換されます。

  • そうでなければ、いずれかのオペランドの対応する実数型は、その実際のタイプに対応する doubleある型に、型ドメインの変更せずに他のオペランドが変換さdouble、 、 ある場合。

  • そうでなければ、いずれかのオペランドの対応する実数型は、その実際のタイプに対応する float ある型に、型ドメインの変更せずに他のオペランドが変換さfloat、 、 ある場合。

  • それ以外の場合、整数昇格は両方のオペランドで実行されます。そして、以下のルールが 昇格オペランドに適用されます :

    • 両方のオペランドが同じ型を持っている場合は、それ以上の変換が必要な ではありません。そうでない場合
    • 、両方のオペランドが整数型を締結または両方 符号なし整数型、 変換ランクをよりランクのオペランドの 型に変換され、より少ない整数のタイプのオペランド を持っている場合。符号なし整数型を持つオペランドがランク大きいか、他のオペランドの タイプ、符号付き整数型を持つ オペランドのランクに等しい を有する場合
    • そうでない場合、 はオペランドの型に変換され符号なし整数型です。
    • そうでなければ、符号付き整数型を持つオペランドの型が 符号なし整数型を に変換されるタイプのオペランドと共に、次いで、符号なし 整数型とオペランドの タイプのすべての値を表すことができる場合符号付き 整数型を持つオペランド。
    • そうでない場合、両方のオペランドが符号付き整数型を持つ オペランドのタイプに対応する符号なし整数型 に変換されます。

私はあなたの特定の例に適用される部分を強調してきました。

整数変換ランクのコンセプトは、6.3.1.1項で定義されています。基本的に、精度が低いタイプの方が精度の高いタイプよりもランクが低くなっています。 Type Conversionsから

5

44ページの暗黙的な変換のセット、非公式に述べていますが、今のところ覚えて正確セットです。 「それ以上に低く、」 - - 彼らはあなたが著者が言うように、種類のthe `lower' type is promoted to the `higher' type,'' where the順序は「」

char < short int < int < long int < float < double < long double 

つまり、ルールが覚えやすい、ということに気づいた場合、覚えやすいですが、署名に関するとそれはあまり役に立ちませんが、これらはOliの投稿でうまく説明されています。しかし、それは覚えやすいですし、ほとんどの場合あなたを助けます。原則として

+0

'署名されていない'はどうやってそこに収まるの? '-1'は' 2U'よりも小さいですか? – pmg

+0

あなたはそうです、それは全体の話のほんの一部です。私はこれを考慮に入れます。 – emboss

+0

+1:記号は本当に '<='でなければならず、C99では混乱に追加する '' long long int''があります:) – pmg

2

それらは同じ種類ではなく、暗黙的に低い精度で型に変数を変換することはありません場合、Cは、2つの値を比較しないであろう。あなたのサンプルコードでは、shortは、書き込みに相当しint、に昇格されます。

int i = 10; 
short s = 5; 

if ((int)s == i){ 
    do stuff... 
} else if ((int)s < i) { 
    do stuff... 
} 

これは正確に何を期待行いますが、同じ符号付き/符号なしの比較の真実ではありません。

1

データ型は、コンピュータに関する限り、intまたはshortがありません。記憶があり、データがあります。

int xと言うとき、あなたはshort yと言うとき、コンピュータに「intを格納するのに十分なバイトを渡してください」と言っています。あなたはそれを推測しています。

shortのように、より少ないバイト数の場合はintとなるため、隣接するバイトにデータが含まれることがあります。異なる種類のデータを比較する場合の問題は、「隣接ビットが偏った結果が発生したりしないのだろうか?」ですあなたは二つの異なるデータ型を比較す​​るたびに

あなたは本当に2つの異なる場所に格納されたビットを比較しています。比較はこれを支援するために使用される

Casting動作するためのデータを表現するために格納された個々のビットの最大数は、同じサイズである必要があります。

関連する問題