2012-05-02 10 views
0

私はちょうど素晴らしいプログラミングの困惑をしました。同じ理由は何ですか?2つの変数の比較

#include <stdio.h> 
#include <limits.h> 

int main(int argc, char *argv[]) 
{ 
    unsigned int x = ULONG_MAX; 
    char y = -1; 
    if (x == y) printf("That is same."); 

    return 0; 
} 

私はunsigned intがsigned charに変換されていると思いますので-1になります。これは、符号付きタイプと符号なしタイプの比較のための標準である場合があります。私は知らない...

+2

この宿題はありますか?もしそうなら、[tag:homework]タグを使用してください。 –

+0

いいえ、そうではありません。 ;-) – RePRO

+0

これは http://stackoverflow.com/questions/6636793/what-are-the-general-rules-for-comparing-different-data-types-in-c –

答えて

2

signed charunsigned intの間に、unsigned intが勝つ!この

Size does matter

ここ

-1よう

ITSはULONG_MAXので、if()条件が真であるunsigned intに変換されます。

Cでは、サイズは関係ありません。変数は、常にその中で最も大きなサイズに変換されます。

+0

完全性のために: 'y'は署名された' char'であるので、その値は 'unsigned int 'に符号拡張されているので、' ULONG_MAX'と正確な '11 ... 11' 。 –

+0

-1と-1の値を返します。どうして? – RePRO

+0

@RePRO私はあなたが 'printf''%d'を使って値を出力していると思います。それで、あなたは '-1'を見ます。 '%d'はその値を' ULONG_MAX'を '-1'に変換する符号付き整数として解釈します。数字の表現は同じですが、解釈は異なります。 '=='は 'unsigned int'を優先し、'%d'は 'signed int'を優先します。 –

1

何年も前、私はいくつかのことを学びました。そのうちの1つはタイプのように比較されました。

unsigned intの値がsizeof char以上である場合、私はunsigned intcharをキャストしますどちらか。または、unsigned intの値をsizeof charに制限する場合は、逆にキャストしてください。そのようにして、値をどのように比較しているかをコンパイラに伝え、メンテナも助けます。

関連する問題