如前所述,这个问题是模棱两可的。
0 当然是显而易见的解决方案,正如其他人所讨论的那样,Java 中没有其他解决方案(这就是问题的标记方式)。
在 C 中,对于任何有符号整数类型,给定类型的最小值可能是一些实现的解决方案。例如,给定一个 2 的补码表示,评估 -INT_MIN 将可能得到 -INT_MIN。但事实上,由于溢出,评估该表达式的行为是 undefined,即使您假设 2 的补码。 (环绕语义很常见,但不能保证。)此外,C 标准不需要 2 的补码表示;它还允许 1's-complement 和 sign-and-magnitude,它们都没有额外的负值。
这个程序:
#include <stdio.h>
#include <limits.h>
int main(void) {
int n = INT_MIN;
printf("%d\n%d\n", n, -n); /* Warning: Undefined behavior for -n */
}
在我的系统上产生这个输出:
-2147483648
-2147483648
对 C 无符号类型的操作具有更严格定义的行为。这个程序:
#include <stdio.h>
#include <limits.h>
int main(void) {
unsigned int n = UINT_MAX / 2 + 1;
printf("%u\n%u\n", n, -n);
}
在具有 32 位 int(且无填充位)的系统上提供此输出:
2147483648
2147483648
并将在任何符合要求的实现上打印两行相同的输出。
C++ 在这方面与 C 有相同的行为(或未定义的行为)。
在 Perl 中,如果一个大整数太大而无法表示为整数,那么它会落入浮点表示形式——但是 Perl 标量很复杂,并且可以同时存储多个表示形式。在我的 64 位系统上,这个 Perl 程序:
#!/usr/bin/perl
use strict;
use warnings;
my $n = -2.0**63;
print $n, "\n", -$n, "\n";
printf "%d\n%d\n", $n, -$n;
给出这个输出:
-9.22337203685478e+18
9.22337203685478e+18
-9223372036854775808
-9223372036854775808
我不完全确定自己能解释清楚。
Python 似乎回退到某种形式的扩展精度整数,因此不会出现溢出问题,因此没有数值是它自己的否定。许多其他语言(包括,我认为,大多数 Lisp 方言)做同样的事情。
在 Ada 中,整数溢出没有未定义的行为;它需要引发异常。这个程序:
with Ada.Text_IO; use Ada.Text_IO;
procedure Foo is
N: Integer := Integer'First;
begin
Put_Line(Integer'Image(N));
Put_Line(Integer'Image(-N));
end Foo;
只产生一行输出:
-2147483648
然后死于 Constraint_Error 异常。
等等,等等,然后……
因此,除非讲师只是在寻找零作为答案,否则它在很大程度上取决于上下文。
看看这个问题,你为什么认为0(这是对所写问题的一个完全正确和明显的答案,显然是 Java 中唯一正确的答案)不是教师正在寻找的为了?