Java 负数会消耗更多内存吗?

Java 负数会消耗更多内存吗?,java,memory,bit,Java,Memory,Bit,我有一个测试程序,检查一个整数的二进制值,一个是正的,另一个是负的 int i = 100; int i2 = -100; System.out.println(Integer.toBinaryString(i)); System.out.println(Integer.toBinaryString(i2)); 结果: 1100100 11111111111111111111111110011100 正如您可以看到的那样,负数比正数有更多的位,这是否意味着负数比正数消耗更多的内存?不,这是

我有一个测试程序,检查一个整数的二进制值,一个是正的,另一个是负的

int i = 100;
int i2 = -100;

System.out.println(Integer.toBinaryString(i));
System.out.println(Integer.toBinaryString(i2));
结果:

1100100
11111111111111111111111110011100

正如您可以看到的那样,负数比正数有更多的位,这是否意味着负数比正数消耗更多的内存?

不,这是它在内部的表示方式,正数具有相同的位数来表示int值


它只是避免前导零

不,两者都是32位的量-整数的宽度在给定的平台上是固定的。它“更短”,因为它截断了所有前导的0


您可能需要阅读整数表示法,特别是2的补码表示法。

否。当您调用
toBinaryString()
时,这些数字在内部消耗相同的位数,它删除了前导零。根据

此值转换为二进制ASCII数字字符串(以2为基数),无额外的前导0

最后,你可以检查一下

输出为

32

因为Java
int
是32位。

不,它不会。Java中整数(int)的最大下限和上限为-2147483648到2147483647。记住,“int”消耗4个字节(32位)

现在让我们将其转换为二进制。它是:

1111111 11111111 11111111 11111111 
 7 bits  8 bits   8 bits   8 bits
总共是31位(第一列只有7位)。剩下的一位是符号位-符号位表示符号。如果设置(即1),则为负,如果不设置,则为正

所以对于正数(max),它是

01111111 11111111 11111111 11111111 
如果是负数,则为负

11111111 11111111 11111111 11111111 
所以尺寸是一样的

语言如C、C++和C语言支持无符号整数(Unt),它也是32位,具有0到4294967295的范围。它丢弃符号位并将其计入

11111111 11111111 11111111 11111111