原码,反码,补码在c语言java中的表示的区别.

首先要区分有符号数和无符号数.  c语言中区分有符号数和无符号数,java中只有有符号数.不存在无符号的情况.
 
一: 无符号数的二进制就是无符号数编码.只有这一种编码
如果是n位的无符号数. 二进制转十进制无符号数的方式是把每位的二进制相加(深入理解计算机系统44页)
 
二: 有符号数的编码通常有补码,原码,反码.
      首先说明一点:正数的原码,反码,补码三个完全相同.只有负数的情况下不同,以下讨论的都是负数的情况下.
      ①: 补码最常见. Java中只有补码表示. 如果是n位的补码.最左位的权是 负的2的(n-1)次方.  深入理解计算机45页
      ②: 反码. 最左边位的权是 负的2的(n-1)次方再减1. 所以表示的数字少了一个
      ③: 原码. 最左边位只表示符号位,不参与计算.这点跟补码的区别注意区分. 
       总结一: 反码,原码中的0都有两种表示. 如反码中的11111111就是0,在补码中表示-1.   原码中的10000000也表示0. 所以他们都少表示一个数.
       有符号数在几乎所有现代机器上都是用补码表示.浮点数中有使用原码编码.
       总结二: 负数的原码求反码的过程是符号位不变,其他位取反. 反码求补码的过程是直接加1. 原码是可以直观看出来的,一般负数计算补码的时候先计算原码或者反码,利用反码加1得出补码.
 
 

以下内容为负数的二进制表示方法:

正数的原码,反码,补码都一样.

负数的原码,反码,补码都不一样,负数在计算机中都以补码的形式存在.

比如-8的原码是

10000000  00000000  00000000  00001000  最左边是符号位

反码是原码取反(符号位不变)

11111111      11111111        11111111       11110111    

补码是反码加1

11111111      11111111        11111111       11111000    

 
posted @ 2020-06-20 17:42  深入理解计算机系统  阅读(211)  评论(0编辑  收藏  举报