`
oboaix
  • 浏览: 268980 次
社区版块
存档分类
最新评论

计算机原码、反码、补码、位移码

    博客分类:
  • JAVA
 
阅读更多

计算机原码、反码、补码、位移码,学习总结:

结合理论与实践记录下来.....

 

操作规则:

A、负数变二进制

原码,取反值,再加上1。

 

B、负数二进制变回实际值(由第一位确定是否为负数)

整体减1,再取反,再乘以-1.

 

eg:

//从十六进制到负数   0xFFFFFFFa ===>> 6
//整体减1,再取反,再乘以-1.
//1111 1010 --> 1111 1001 --> 0000 0110 --> -6

--------------------------------------------------------------------

///原码,加上1,再取反值。-6 ===>> 0xFFFFFFFa
//从负数到十六进制
//0000 0110 --> 0000 0111 --> 1111 1000 --> 0xFFFFFFFa

 

-6  补码
00000110
11111001
+      1
--------
11111010


-10  补码
00001010
11110101
+      1
--------
11110110


32+ 1 + 2+ 4 + 8
//////////////// 
-15   补码
0000 1111
1111 0000
+       1
---------
1111 0001   字节
FFFFFFF1    双字节

////////////////
-1   补码
00000001
11111110
+      1
--------
11111111
FFFFFFFF

从FFFFFFF1找出实际值,首先拿到最后两位
11110001
-      1
--------
11110000
00001111
--------
      15
    * -1
---------
      -15

 

计算机是以补码的形式表示数值型数据的。
正数的原码、反码、补码都是一样的。
负数的原码和和它的绝对值所对应的原码相同,简单的说就是绝对值相同的数原码相同;
反码就是再逐个取反,补码就是在这个反码的基础上再次加1,即就是计算机存储形式补码。

其实反码、补码的提出就是针对负数的,跟正数屁关系没有。
也许只是为了统一一下说法“计算机都是以补码的形式表示数据的”,
不然就得说正数是用原码表示,负数时用补码表示。 

补码。负数在计算机中的表示步骤:原码——反码(符号位不变)——补码(加1)。
由补码计算出负数真值的方法有两种。
一是,补码减1——取反(符号位不变)——原码;二是,补码——取反后加1——原码。所有的取反都不涉及符号位。


正数就是按照实际计算;
负数就是按照位置位取反,再加1,做进位计算。

总结一下
计算机储存有符号的整数时,是用该整数的补码进行储存的,
0的原码、补码都是0,正数的原码、补码可以特殊理解为相同,负数的补码是它的反码加1。

对于负数二进制回到十进制刚好使用相反的计算法则:
整体减1,再取反,再乘以-1.


十进制 → 二进制  (怎么算?要是不知道看计算机基础的书去) 
47   → 101111 

有符号的整数   原码    反码    补码 
  47      00101111  00101111  00101111(正数补码和原码、反码相同,不能从字面理解。计算机保存形式00101111) 
 -47      10101111  11010000  11010001(负数补码是在反码上加1,计算机保存形式就是补码11010001) 

 

负数原码:

符号位1 + 绝对值的本身

举例: -7的原码: 10000111    +7的原码: 00000111

+0 的原码:00000000  -0的原码:10000000

+0的反码: 00000000  -0的反码:11111111

 

& 与。    全1为1, 有0为0。  任何数与0与都等于0。           

| 或。      有1为1, 全0为0。  任何数与0或都等于原值。         

~ 非。     逐位取反         

^ 异或。  相同为0,相异为1。      任何数与0异或都等于原值。

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics