2017-07-27 7 views
-1

Iは受信備考

int32_t A = 5; 
uint32_t B = 8; 
if (A >= B) 
{ 
    printf("Test"); 
} 

以下のように「C」コードスニペットを有します1 Aが正でB2^31未満の間、アドレスこの問題?

+0

あなたは 'int32_t'(signed)と' uint32_t'(unsigned)を比較しています。あなたは何を期待しましたか? –

+2

'int32_t'と' uint32_t'の違いは分かりますか? – babon

+0

'A'が' -5'だったらどうなりますか? 'B'は否定的なことはできません。 –

答えて

0

すべてはokです。

しかし、Aはunexpect、その後、以下0であればエビデンスが発生します。

A = -1で、メモリには0xFFFFFFFFとして保存されます。 B = 5、メモリには0x00000005として保存されます。

あなたは

if (A < B) { 
    //Something, you are expecting to be here 
} 

を行うとに展開される場合、コンパイラは、32ビットの符号なし整数としてそれらを比較し、あなたになります。

if (0xFFFFFFFF < 0x00000005) { 
    //Do something, it will fail. 
} 

コンパイラは、この起こり得る問題について警告します。

Comparison operation on unsigned and signed integers

+0

負の数値がメモリにどのように保存されるかは実装によって定義されています。 'A

1

良い、非常に良い!あなたは読んで、あなたのコンパイラ警告に注意を払っています。あなたのコードで

int32_t A = 5; 
uint32_t B = 8; 

if (A >= B) 
{ 
    printf("Test"); 
} 

-2147483648/2147483647の最小/最大値でint32_t値に署名し、あなたがそれぞれ0/4294967295の最小/最大、であり、符号なしuint32_tとしてあなたは'A'を持っています。コンパイラは、関連する型に基づいて常に真または偽のケースを防ぐための警告を生成します。ここでは、Bから2147483648 - 4294967295までの許容範囲内の値については、ABより大きくすることはできません。数字の全部は、個々の値に関係なくFalseを提供します。

もう一つの大きな例は、符号なしタイプがゼロ未満であることはできないので-2147483648 - -1からAのすべての値に対してTRUEを生成if (A < B)であろう。

コンパイラの警告には、これらのタイプのテストでは、特定の範囲の数値に対して有効な比較が提供されない可能性があります。現実の世界では

、あなたはAのみ、例えば、その後、あなたは、単に1)あなたは警告を理解し、あなたのキャストで2)の値が有効なテストを提供することを保証することをコンパイラに伝えることができ、0 - 900からの値を保持している知っていればあなたは1)& 2)ための保証を行うことができない場合

int32_t A = 5; 
uint32_t B = 8; 

if (A >= 0) { 
    if ((uint32_t)A >= B) 
     printf("Test"); 
} 
else 
    /* handle error */ 

は、あなたが警告に直面していない方法で、コードを書き換える行く時間です。

ここで2つの良いことが起こりました。 コンパイラの警告が有効になっていて、コンパイラがあなたに何を伝えているかを読んで理解する時間がかかりました。これは時間と時間が再び来るでしょう。今、あなたは何ができるか/行われるべきかの決定に近づく方法を知っています。