欢迎整数推广。如果我可以从网站上引用:
如果一个 int 可以表示原始类型的所有值,则将该值转换为 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 的创造者之一)在这个问题上所说的话:
Gosling:作为一名语言设计师,我现在并不认为自己是这样的,“简单”最终的真正含义是我能否期望 J. Random Developer 将规范牢牢记在脑海中。该定义表明,例如,Java 不是——事实上,这些语言中的许多最终都会出现很多极端情况,即没有人真正理解的事情。向任何 C 开发人员询问有关无符号的问题,很快你就会发现几乎没有 C 开发人员真正了解无符号是怎么回事,什么是无符号算术。这样的事情使 C 变得复杂。我认为 Java 的语言部分非常简单。您必须查找的库。