欢迎整数促销。如果我可以从网站上引用:
如果一个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的创建者之一)在这个问题上必须说的:
高斯林:对于我作为语言设计师来说,这些天我并不算是真正的自己,“简单”最终的含义是我可以期望J. Random Developer掌握该规范。该定义表明,例如,Java并非如此-实际上,其中许多语言最终都带有很多极端情况,这是没人真正理解的。询问任何C开发人员有关无符号的知识,很快您就会发现几乎没有C开发人员真正了解无符号的含义,无符号的算法是什么。这样的事情使C变得复杂。我认为Java的语言部分非常简单。您必须查找的库。