在Java中如何在位级别上内部表示整数?

我试图了解Java如何在内部存储整数。我知道所有Java基本整数都是带符号的(短符号除外)。这意味着该字节的字节数少了一位。


我的问题是,是否所有整数(正数和负数)都存储为二进制补码,或者仅是负数在二进制补码中?


我看到规格说明了x bit two's complement number。但是我经常感到困惑。


例如:


  int x = 15; // Stored as binary as is?  00000000 00000000 00000000 00001111?

  int y = -22; // Stored as two complemented value? 11111111 11111111 11111111 11101010

编辑


要清楚一点 x = 15


   In binary as is: `00000000 00000000 00000000 00001111'

  Two's complement: `11111111 11111111 11111111 11110001`

因此,如果您的答案是  all数字存储为二进制补码,则:


  int x = 15; // 11111111 11111111 11111111 11110001

  int y = -22 // 11111111 11111111 11111111 11101010

这里的混乱再次是符号说的,都是负数。可能是我误读/误解了吗?


编辑 不确定我的问题是否令人困惑。被迫隔离问题:


我的问题恰恰是:正数存储为binary as is,负数存储为two's complement吗?


有人说所有数字都存储在二进制补码中,一个回答说只有负数被存储为二进制补码。


杨魅力
浏览 458回答 3
3回答

白猪掌柜的

Java整数为32位,并且总是带符号的。这意味着,最高有效位(MSB)用作符号位。用an表示的整数int不过是位的加权和。权重分配如下:Bit#    Weight31      -2^3130       2^3029       2^29...      ...2        2^21        2^10        2^0请注意,MSB的权数为负(实际上最大可能为负),因此,当该位打开时,整数(加权和)将为负。让我们用4位数字对其进行仿真:Binary    Weighted sum            Integer value0000       0 + 0 + 0 + 0           00001       0 + 0 + 0 + 2^0         10010       0 + 0 + 2^1 + 0         20011       0 + 0 + 2^1 + 2^0       30100       0 + 2^2 + 0 + 0         40101       0 + 2^2 + 0 + 2^0       50110       0 + 2^2 + 2^1 + 0       60111       0 + 2^2 + 2^1 + 2^0     7 -> the most positive value1000      -2^3 + 0 + 0 + 0        -8 -> the most negative value1001      -2^3 + 0 + 0 + 2^0      -71010      -2^3 + 0 + 2^1 + 0      -61011      -2^3 + 0 + 2^1 + 2^0    -51100      -2^3 + 2^2 + 0 + 0      -41101      -2^3 + 2^2 + 0 + 2^0    -31110      -2^3 + 2^2 + 2^1 + 0    -21111      -2^3 + 2^2 + 2^1 + 2^0  -1因此,二进制补码不是表示负整数的排他方案,而是可以说整数的二进制表示始终相同,我们只是忽略了最高有效位的权重。该位确定整数的符号。在C中,有一个关键字unsigned(在Java中不可用),可用于声明unsigned int x;。在无符号整数中,MSB的权重为正(2^31),而不为负。在这种情况下,an的范围unsigned int是0to 2^32 - 1,而an的int范围是-2^31to 2^31 - 1。从另一个角度来看,如果您考虑xas 的二的补码~x + 1(NOT x加一),则说明如下:对于任何x,~x都只是的按位倒数x,因此,凡是x带有1-bit的位置,~x都将带有0-bit的位置(反之亦然)。因此,如果将它们加起来,则加法运算中将不会有进位,并且总和将只是一个整数,其每一位均为1。对于32位整数:x + ~x = 1111 1111 1111 1111 1111 1111 1111 1111x + ~x + 1 =   1111 1111 1111 1111 1111 1111 1111 1111 + 1           = 1 0000 0000 0000 0000 0000 0000 0000 0000最左边的1位将被丢弃,因为它不适合32位(整数溢出)。所以,x + ~x + 1 = 0-x = ~x + 1因此,您可以看到负数x可以由表示~x + 1,我们称它们为的补数x。

LEATH

我已经运行了以下程序来了解它public class Negative {    public static void main(String[] args) {        int i =10;        int j = -10;        System.out.println(Integer.toBinaryString(i));        System.out.println(Integer.toBinaryString(j));    }}输出是101011111111111111111111111111110110从输出看来,它一直在使用二进制补码。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java