一、第一位是符号位:0代表正数,1代表负数。
二、正数的原码,补码,反码都是一样的。
比如:7的 原码,反码,补码都是 00000111
三、着重谈谈负数的 原码,补码,反码
1)负数的原码: 第一位置为1即可。
如: -7 的原码就是: 10000111
注意:a. 数0的原码有两种形式:[+0]原=00000000B [-0]原=10000000B
2)负数的反码: 除符号位不变外,其他位是原码取反
如:-7的反码就是 1 1111000
注意:a. 数0的反码也有两种形式,即 [+0]反=00000000B [- 0]反=11111111B
3)负数的补码: 反码+1
如:[-7]补= 1 1111001
注意:补码的好处
a. 采用补码后,可以方便地将减法运算转化成加法运算,运算过程得到简化。采用补码进行运算,所得结果仍为补码。
b. 与原码、反码不同,数值0的补码只有一个,即 [0]补=00000000B。
四、已知补码,求原码。
计算方法: 补码的补码即为 原码。
例:已知某数X的补码11101110B,试求其原码。
解:由[X]补=11101110B知,X为负数。求其原码表示时,符号位不变,数值部分按位求反,再在末位加1。
1 1 1 0 1 1 1 0 补码
1 0 0 1 0 0 0 1 符号位不变,数值位取反
1 +1
1 0 0 1 0 0 1 0 原码
五、~ 按位取反操作
问题: 在java中,int i = 3;~i = ?
答:我们首先来看Java的数据类型所占字节数
java数据类型 字节 表示范围
byte(字节型) 1 -128~127
short(短整型) 2 -32768~32767
int(整型) 4 -2147483648~2147483647
long(长整型) 8 -9223372036854775808 ~ 9223372036854775807
float(浮点型) 4 -3.4E38~3.4E38
double(双精度型) 8 -1.7E308~1.7E308
char(字符型) 2 从字符型对应的整型数来划分,其表示范围是0~65535
boolean(布尔型) 1 true或false
我们知道java int类型的长度是4个字节,所有3 在内存中的存储形式是: 00000000 00000000 00000000 00000011
按位取反后为:11111111 11111111 11111111 11111100
那么这个数是多少呢,1开头的,那就是负数,负数在内存中的形式是补码。
现在要通过补码求原码,然后才知道真实值。
补码求原码的方法是: 补码的补码
1 00000000000000000000011
+1
100000000000000000000100
所以答案为 -4