「直感的」とは、与えられたという意味です
int a = -1;
unsigned int b = 3;
式(a < b)
は 1 に評価される必要があります。
Stackoverflow には、この特定のケースで C コンパイラが符号付き/符号なしの比較について不平を言う理由をすでに尋ねる多くの質問があります。答えは、整数変換規則などに要約されます。それでも、符号付き整数と符号なし整数を比較するときにコンパイラが非常に愚かでなければならない理由はないようです。上記の宣言を使用すると、Why 式は次のようになります
(a < b)
によって自動的に置換されません
(a < 0 || (unsigned int)a < b)
それを適切に行うための単一の機械命令がない場合はどうなりますか?
現在、以前の質問に対して、「符号付き整数と符号なし整数を混在させる必要がある場合、プログラムに問題があります」というコメントがいくつかありました。libc自体が符号付きのみまたは符号なしのみの世界に住むことを不可能にするので、私はそれを買いません(たとえばsprintf()
、関数のファミリはint
、書き込まれたバイト数として返され、send()
返さssize_t
れるなど)。
また、以下のコメントで表現されている、符号付き整数から符号なしへの暗黙的(d - '0' < 10U)
な変換 ( 「イディオム」) は、明示的なキャスト ( ) と比較して、C プログラマーにいくつかの追加の力を与えるというアイデアを購入できるとは思いません((unsigned int)(d - '0') < 10U)
。しかし、確かに、それは台無しにする幅広い機会を開きます.
そして、はい、コンパイラがそれを行うことができないと警告してくれてうれしいです (残念ながら、明示的に要求した場合のみ)。問題は、なぜできないのかということです。通常、標準のルールの背後には正当な理由があるので、ここに何かあるのだろうか?