Iは受信備考
int32_t A = 5;
uint32_t B = 8;
if (A >= B)
{
printf("Test");
}
以下のように「C」コードスニペットを有します1 A
が正でB
が2^31
未満の間、アドレスこの問題?
Iは受信備考
int32_t A = 5;
uint32_t B = 8;
if (A >= B)
{
printf("Test");
}
以下のように「C」コードスニペットを有します1 A
が正でB
が2^31
未満の間、アドレスこの問題?
すべては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.
}
コンパイラは、この起こり得る問題について警告します。
負の数値がメモリにどのように保存されるかは実装によって定義されています。 'A
良い、非常に良い!あなたは読んで、あなたのコンパイラ警告に注意を払っています。あなたのコードで
:
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
までの許容範囲内の値については、A
をB
より大きくすることはできません。数字の全部は、個々の値に関係なく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つの良いことが起こりました。 コンパイラの警告が有効になっていて、コンパイラがあなたに何を伝えているかを読んで理解する時間がかかりました。これは時間と時間が再び来るでしょう。今、あなたは何ができるか/行われるべきかの決定に近づく方法を知っています。
あなたは 'int32_t'(signed)と' uint32_t'(unsigned)を比較しています。あなたは何を期待しましたか? –
'int32_t'と' uint32_t'の違いは分かりますか? – babon
'A'が' -5'だったらどうなりますか? 'B'は否定的なことはできません。 –