Java 为什么我从system.out.println()和system.exit()得到两个不同的值?

Java 为什么我从system.out.println()和system.exit()得到两个不同的值?,java,unix,Java,Unix,当我在unix中运行代码时,system.exit(Integer.parseInt(e.getMessage())给出254 输出: System.out.println(Integer.parseInt(e.getMessage())); System.out.println(e.getMessage()); System.exit(Integer.parseInt(e.getMessage())); 二进制级别的转换从int转换为byte(254是-2整数的低级字节) 请注意,这种情况

当我在unix中运行代码时,
system.exit(Integer.parseInt(e.getMessage())
给出254

输出:

System.out.println(Integer.parseInt(e.getMessage()));
System.out.println(e.getMessage());
System.exit(Integer.parseInt(e.getMessage()));

二进制级别的转换从
int
转换为
byte
(254是-2整数的低级字节)


请注意,这种情况在java中不会发生(本机的
Shutdown.halt0
方法接收int),因为在不同的平台上可能会有所不同。

您的操作系统的退出代码是无符号8位整数,因此唯一有效的退出代码是0..255

得到254的原因是因为它是
int
-2的低8位被视为无符号数

-2  
-2  
254

由于System.exit()需要在0-255之间取正值,
-2
在实践中会变成
256-2=254

,这是通常发生的情况。理论上,javadocs并没有指定正在发生的事情。。。在其他平台上可能会有所不同。如果我希望-2作为system的结果接收,我应该在上面的代码中执行什么操作。如果我希望-2作为system.ext()的结果接收,我应该执行什么操作?-2不能由8位无符号数表示。唯一有效的选项是0..255。
$ for q in -2 -1 0 1 2 253 254 255 256 257 ; do
   perl -e'exit $ARGV[0]' -- $q
   printf '%3d => %3d\n' $q $?
done
 -2 => 254
 -1 => 255
  0 =>   0
  1 =>   1
  2 =>   2
253 => 253
254 => 254
255 => 255
256 =>   0
257 =>   1