2016-11-05 11 views
0
int x, N; 

Nは常に正です。次の2行は同等ですか?一般的な実装でこれらの2つの式は等価ですか

if (x>=0 && x<N)  

if ((unsigned)x < (unsigned)N) 
+1

はい。それは[this]の特定の場合です(http://stackoverflow.com/a/17095534/995714) –

+1

質問が投票された理由を知りたい –

+0

あなたの問題を解決した答えがあると思われる場合は、それを受け入れることを検討してください(答えの左側に緑色のチェックマークが付きます)。これはコミュニティに質問が答えられたことを示し、あなたと回答者にいくつかの評判を与えます。 – 2501

答えて

2

、はい、彼らは等価です:xが負の場合、(unsigned) xINT_MAXより大きくなります。これは必然的に必ず(unsigned) x < (unsigned) Nが偽になることを意味します。

まれにしか実装されていませんが、同等ではありません。実装では、とunsigned intに同じ値のビット(INT_MAX == UINT_MAX)を与えることができます。この場合、(unsigned) xINT_MAXより大きくならず、(unsigned) x < (unsigned) Nは依然として真である場合があります。

1

UINT_MAXがINT_MAXの場合、線は等価ではありません。 Cはそのような実装を可能にする。ラップアラウンドその場合

は、xはunsigned int型にint型から変換されたとき、例えばN.

よりも大きい値を生成しないことがあります。Nの値はINT_MAXで、値をxの値は-2です。符号付き整数から符号なし整数への変換が完了すると、Nの値はINT_MAXになりますが、xの値はINT_MAX-1になります。したがって、2番目のif文は使用されますが、最初のif文は使用されません。

実際には、おそらくそのような実装には遭遇しません。 UINT_MAXの値がINT_MAXより大きい場合、if文は同じ動作をします。この動作は、常にアサートできます。

static_assert(UINT_MAX > INT_MAX , ""); 
+0

'UINT_MAX == INT_MAX'を持つ既存(過去または現在)の実装もありません。私はそれが理論的な将来の可能性だと思うが、それには良いお金を賭けていないだろう。 – Peter

+0

@Peter非常に奇妙な実装がありましたが、最近ではオンラインで情報がほとんどまたはまったく見つかりません。私が決して存在しなかったと誓ったことのあるものは存在することが判明しましたが、実際に検査する方法はありません。そのような実装が存在しなかったというあなたの主張を確認する正式な情報源がありますか? – hvd

関連する問題