位 相关

2020-04-23  本文已影响0人  一个追寻者的故事
基本概念

我们都知道,整数在计算机中是以 二进制 表示的。
Java 中的 有符号的 int 四字节(8位字节)为例:

二进制 十进制
01111111 11111111 11111111 11111111 2147483647(Integer.MAX_VALUE)
............ .....
00000000 00000000 00000000 00000101 5
00000000 00000000 00000000 00000100 4
00000000 00000000 00000000 00000011 3
00000000 00000000 00000000 00000010 2
00000000 00000000 00000000 00000001 1
00000000 00000000 00000000 00000000 0
11111111 11111111 11111111 11111111 -1
11111111 11111111 11111111 11111110 -2
11111111 11111111 11111111 11111101 -3
11111111 11111111 11111111 11111100 -4
11111111 11111111 11111111 11111011 -5
....... ......
1000000 0000000 0000000 0000000 -2147483648(Integer.MIN_VALUE)
原码、反码、补码

计算机中,正整数用原码存储,负整数用 正整数的 补码存储。(这一套规则,既实现简单又运行高效。当然也可以定义其它规则,就看能不能更高效、实现更简单)

以十进制中的 1 为例:
原码: 00000000 00000000 00000000 00000001
反码: 11111111 11111111 11111111 11111110
补码: 11111111 11111111 11111111 11111111

反码 为 原码按位取反,补码 = 反码 + 1

其实不管怎么样存储 正整数、负整数,最终都要满足 A + (-A) = 0
任何一个 正整数 的原码 + 反码 的结果都是 11111111 11111111 11111111 11111111。 所以再 + 1,结果就都为 00000000 00000000 00000000 00000000 。 所以 负整数 用补码表示 正好满足:A + (-A) = 0

其它

1、问:为什么 int 能表示的 正整数负整数 少一个呢?
答:因为 0 占用了 正整数 所能表达的一个份额

2、在Java 中可以给 int 用 10进制 赋值,也可以用 16进制 赋值,当然也可以直接用位运算的结果赋值。

/**
使用十进制赋值时,会在运行时自动转成 二进制(整数用原码、复数用补码) 去运算和计算。
**/
int a = 5;
int b = -6;

/**
如果使用以下方式赋值。会看最高位,如果是0,会认为是 正整数的原码形式;如果是 1,会认为是 负整数 的补码形式
**/
int c = 0x7fffffff;
int d = 1 << 30;

3、关于位运算的一个有意思的

位运算 二进制结果 十进制结果
1 << 30 01000000 00000000 00000000 00000000 1073741824
1 << 31 10000000 00000000 00000000 00000000 Integer.MIN_VALUE
1 << 31 00000000 00000000 00000000 00000001 1
1 << 32 00000000 00000000 00000000 00000010 2
1 << 33 00000000 00000000 00000000 00000100 4
上一篇 下一篇

猜你喜欢

热点阅读