关于java中的强制类型转换和二进制表示问题

273次阅读

共计 654 个字符,预计需要花费 2 分钟才能阅读完成。

1、Java 中用补码形式表示
2、第一位正负位,1 表示负,0 表示正。
3、原码:一个数的二进制表示。

             3 的原码 00000011   - 3 的 原码 10000011

4、反码:负数原码按位取反(符号位不变)。正数原码本身。

            3 的反码 00000011   - 3 的反码 11111100

5、补码:正数是原码本身。负数反码加 1。

             3 的补码是 00000011  - 3 的补码是 11111101

int 占 4 个字节,32 位
byte 占 1 个字节,8 位
所以强转时会截断。前 24 位

在内存中表示形式(注意 java 中是以补码表示一个数,所以表示形式是补码,不是原码!):
int a = 3 00000000 00000000 00000000 00000011(强转 byte 时前面 24 个 0 被截断)
byte b = 3 00000011
int a = -3 11111111 11111111 11111111 11111101(强转 byte 时前面 24 个 1 被截断)
byte b = -3 11111101

已知负数的补码,求负数:
补码 -1= 反码,反码按位取反 = 该负数绝对值
已知负数,求负数的补码:
1、负数原码除了符号位,按位取反(不含符号位),加 1。
2、负数绝对值的补码(也就是原码),按位取反(含符号位),加 1

例子:
java int 128 转为 byte,值:
128 为正数,补码为 10000000(前面 24 个 0 省略),变成 byte,只剩下 10000000(byte 为 1 个字节),因为开头是 1,所以为负数。即 1 个负数的补码是 10000000。反码是 01111111,原码是 1000000。是 128. 因为是负数,所以是 -128。

正文完
 0