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