你这个标签有 C/C++/Java,估计是系统自动判断的吧。楼上的解释有些不完全对。在 C/C++ 等语言中,区分有符号和无符号类型,但 Java 中无区分。在 Java 中,表示这样的一个无符号整数,必须用 long,是 64 位的。int 是装不下的,赋值都无法通过编译。但 C/C++ 的话,现在主流 x86 平台的 int 和 long 都是 32 位宽,不会出现无法编译的情况,但可能会警告,而且不管是这个长整数还是 -1,在内存中存储方式都一样。如果是用 C 语言中的 printf 输出,具体的结果和是否有符号无关,取决于格式化字符串如何书写。如果用 C++ 的 count 输出,一般重载了运算符,所以如果变量类型是无符号就输出无符号,变量类型有符号就输出有符号的。C/C++ 的编译器各家的实现和警告信息都略有不同,我这里在 Linux 上的 gcc 编译这段代码,警告如下,但不影响结果。
#include
#include
int main(int argc, char *argv[])
{
printf("%d\n", 4294967295 | 1);
return 0;
}
cc test.c -o test
test.c: In function ‘main’:
test.c:6:9: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long int’ [-Wformat=]
printf("%d\n", 4294967295 | 1);
^
执行的结果就是输出 -1。