整数プロモーションへようこそ。ウェブサイトから引用する場合:
int が元の型のすべての値を表すことができる場合、値は int に変換されます。それ以外の場合は、unsigned int に変換されます。これらは整数プロモーションと呼ばれます。他のすべての型は、整数の昇格によって変更されません。
C は、このような比較を行うと非常に混乱する可能性があります。私は最近、C 以外のプログラミングの友人の何人かを、次のいじめで困惑させました。
#include <stdio.h>
#include <string.h>
int main()
{
char* string = "One looooooooooong string";
printf("%d\n", strlen(string));
if (strlen(string) < -1) printf("This cannot be happening :(");
return 0;
}
これは実際にThis cannot be happening :(
出力され、25 が -1 より小さいことを示しているようです!
ただし、下で発生するのは、-1 が符号なし整数として表されることです。これは、基になるビット表現により、32 ビット システムでは 4294967295 に等しくなります。当然、25 は 4294967295 より小さいです。
size_t
ただし、によって返される型strlen
を符号付き整数として明示的にキャストすると、次のようになります。
if ((int)(strlen(string)) < -1)
次に、25 と -1 を比較すると、すべてがうまくいきます。
優れたコンパイラは、符号なし整数と符号付き整数の比較について警告するはずですが、それでも見落としがちです (特に警告を有効にしない場合)。
これは、すべてのプリミティブ型が署名されているため、Java プログラマーにとって特に混乱を招きます。James Gosling (Java の作成者の 1 人)は、この件に関して次のように述べています。
Gosling: 言語設計者としての私にとって (最近はそうではありませんが)、「単純」が最終的に意味するものは、J. Random 開発者が仕様を頭の中に保持することを期待できるかということでした。その定義は、たとえばJavaはそうではないと言っています。実際、これらの言語の多くは、多くのコーナーケース、つまり誰も本当に理解していないものになります。符号なしについて C 開発者に質問すると、すぐに、符号なしで何が行われるか、符号なし演算とは何かを実際に理解している C 開発者はほとんどいないことがわかります。そのようなことが C を複雑にしました。Java の言語部分はかなり単純だと思います。検索する必要があるライブラリ。