所以我有这个测试程序检查一个整数的二进制值是正的而另一个是负的。
int i = 100;
int i2 = -100;
System.out.println(Integer.toBinaryString(i));
System.out.println(Integer.toBinaryString(i2));
结果:
1100100
11111111111111111111111110011100
正如你可以看到负数比正数有更多的比特,这是否意味着负数消耗的内存多于正数?
答案 0 :(得分:9)
不,两者都是32位数量 - 整数的宽度在给定平台上是固定的。它"更短"因为它截断了所有领先的0。
您可能希望对整数表示进行一些阅读,特别是两个补码表示。
答案 1 :(得分:8)
不,它是如何在内部表示的,正数表示具有相同的位数来表示int值
它只是避免前导零
答案 2 :(得分:3)
没有。这些数字在内部消耗相同的位数,当您调用toBinaryString()
时,它会删除前导零。根据{{3}},
此值转换为二进制(基数2)中的ASCII数字字符串,没有额外的前导0。
最后,您可以查看Javadoc,
System.out.println(Integer.SIZE);
输出
32
因为Java int
是32位。
答案 3 :(得分:3)
不,不会。 Java中整数(int)的最大下限和上限是-2,147,483,648到2,147,483,647。请记住'int'消耗4个字节(32位)。
让我们把它放在二进制现在..它是:
1111111 11111111 11111111 11111111
7 bits 8 bits 8 bits 8 bits
总共31位(第一列只有7位)。剩下的一位是符号位 - 符号位表示符号。如果设置(即1),则为负,如果不是 - 为正。
因此,对于正数(最大),它将是
01111111 11111111 11111111 11111111
对于否定,它将是
11111111 11111111 11111111 11111111
所以尺寸将是相同的。
C,C ++和C#等语言 - 支持无符号整数(uint),它也是32位,范围为0到4,294,967,295。它会丢弃符号位并对其进行计数。