为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

杨魅力 2019-10-05 15:25:33
我试图了解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吗?有人说所有数字都存储在二进制补码中,一个回答说只有负数被存储为二进制补码。
查看完整描述

3 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

Java整数为32位,并且总是带符号的。这意味着,最高有效位(MSB)用作符号位。用an表示的整数int不过是位的加权和。权重分配如下:


Bit#    Weight

31      -2^31

30       2^30

29       2^29

...      ...

2        2^2

1        2^1

0        2^0

请注意,MSB的权数为负(实际上最大可能为负),因此,当该位打开时,整数(加权和)将为负。


让我们用4位数字对其进行仿真:


Binary    Weighted sum            Integer value

0000       0 + 0 + 0 + 0           0

0001       0 + 0 + 0 + 2^0         1

0010       0 + 0 + 2^1 + 0         2

0011       0 + 0 + 2^1 + 2^0       3

0100       0 + 2^2 + 0 + 0         4

0101       0 + 2^2 + 0 + 2^0       5

0110       0 + 2^2 + 2^1 + 0       6

0111       0 + 2^2 + 2^1 + 2^0     7 -> the most positive value

1000      -2^3 + 0 + 0 + 0        -8 -> the most negative value

1001      -2^3 + 0 + 0 + 2^0      -7

1010      -2^3 + 0 + 2^1 + 0      -6

1011      -2^3 + 0 + 2^1 + 2^0    -5

1100      -2^3 + 2^2 + 0 + 0      -4

1101      -2^3 + 2^2 + 0 + 2^0    -3

1110      -2^3 + 2^2 + 2^1 + 0    -2

1111      -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 1111

x + ~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。


查看完整回答
反对 回复 2019-10-05
?
LEATH

TA贡献1936条经验 获得超6个赞

我已经运行了以下程序来了解它


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));

    }

}

输出是


1010

11111111111111111111111111110110

从输出看来,它一直在使用二进制补码。


查看完整回答
反对 回复 2019-10-05
  • 3 回答
  • 0 关注
  • 457 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信