这可能是一个非常基本的问题。但我想首先清楚地理解基本概念。 问题是关于java中整数的位表示。
在Java中,整数表示在32-bits
中。
int y = 3
;表示为00000000 00000000 00000000 00000011
32nd bit
是带符号的位,用于表示符号(如果为+则为0,如果为-ve则为1)
我不明白的是签名时整数的包装方式和原因:
例如:
y —->00000000 00000000 00000000 00000011 //3
x — > 11111111 11111111 11111111 11111101 // -3
虽然它应该是:
10000000 00000000 00000000 00000011 // -3
是3://00000000 00000000 00000000 00000011,
通过查看打开的位
,我可以通过1^0 + 2 ^1
得到小数值
当-3://11111111 11111111 11111111 11111101
时
我看到计算十进制值并不容易。
如果-3表示为10000000 00000000 00000000 00000011:
使用第一位,我得到-ve,通常的十进制计算可以得到3
类似地,对于带有-ve符号的整数max,仅打开第1位和第32位:
-2147483647 —> 10000000 00000000 00000000 00000001
-2 —> 11111111 11111111 11111111 11111110
-1 —> 11111111 11111111 11111111 11111111
我不明白如何读取这些位来获取十进制值,或者通过打开所有位来表示-1的确切位置。
感谢您提供帮助。
答案 0 :(得分:1)
正如@clcto在评论中所建议的,请查看2s补码表示。
答案 1 :(得分:1)
为简单起见,让我们谈谈8位。在无符号算术中,这只是
00000011 = 0 * 2 ^ 7 + 0 * 2 ^ 6 + 0 * 2 ^ 5 + 0 * 2 ^ 4 + 0 * 2 ^ 3 + 0 * 2 ^ 2 + 1 * 2 ^ 1 + 1 * 2 ^ 0
在二进制补码表示中, -1 表示为
11111111 = 1 * - (2 ^ 7)+ 1 * 2 ^ 6 + 1 * 2 ^ 5 + 1 * 2 ^ 4 + 1 * 2 ^ 3 + 1 * 2 ^ 2 + 1 * 2 ^ 1 + 1 * 2 ^ 0
二进制补码表示法的唯一区别在于顶部位代表它通常代表的数字的否定。
这种表现形式更方便。