原码,补码,反码区分

原码,补码,反码是计算机二进制中的存储方式。

原码:是最简单的机器数表示法。用最高位表示符号位,‘1’表示负号,‘0’表示正号。其他位存放该数的二进制的绝对值。

反码:正数的反码还是等于原码

负数的反码就是他的原码除符号位外,按位取反。

补码:正数的补码等于他的原码
负数的补码等于反码+1。

在计算机当中是使用补码来存储的。

例如

整型(int) 为45 整型为4字节 32位

原码: 00000000 0010 0111

反码:1111 1111 1101 1000

补码:000 0000 0010 0111

整型(int)-45

原码:1000 0000 0010 0111

反码:1111 1111 1101 1000

补码:1111 1111 1101 1001

用Java语言实现 int 类型转换如下:

  1 package ClassroomTest;
  2 
  3 import java.util.Scanner;
  4 
  5 public class Second {
  6 
  7 
  8     
  9     @SuppressWarnings("resource")
 10     public static void main(String[] args) {
 11         int s[] =new int[32];
 12         int y[]=new int[32];
 13         int f[]=new int[32];
 14         int i=0;
 15         int c;
 16         Scanner sc=null;
 17         System.out.println("请输入一个整数:");
 18         sc=new Scanner(System.in);
 19         int a=sc.nextInt();
 20         if(a>=0) {  //整数判断
 21         while(a>=1) {   //存入原码
 22             c=a%2;
 23             s[i]=c; 
 24             a=a/2;
 25             i++;
 26         }
 27          int j;
 28          j=31;
 29         for(i=0;i<s.length;i++) {
 30                 y[j]=s[i];
 31                 j--;
 32             }
 33         System.out.println();
 34        System.out.println("原码:");  //输出原码   
 35        for(i=0;i<y.length;i++) {     //符号位为0
 36            System.out.print(y[i]);
 37               if((i+1)%4==0) {
 38                   System.out.print(" ");
 39             }
 40         }
 41        System.out.println();
 42        System.out.println("反码:");  //输出反码  全部取反
 43        for(i=(y.length-1);i>=0;i--) {
 44            if(y[i]==0) {
 45                f[i]=1;
 46            }else {
 47                f[i]=0;
 48            }
 49        }
 50        for(i=0;i<f.length;i++) {
 51            System.out.print(f[i]);
 52               if((i+1)%4==0) {
 53                   System.out.print(" ");
 54             }
 55        }
 56        System.out.println();
 57        System.out.println("补码:");   //输出补码  与原码相同
 58        for(i=0;i<y.length;i++) {
 59            System.out.print(y[i]);
 60               if((i+1)%4==0) {
 61                   System.out.print(" ");
 62             }
 63         }
 64     }else {  //当输入整数为负数时
 65         a=-a;
 66         while(a>=1) {
 67             c=a%2;
 68             s[i]=c;
 69             a=a/2;
 70             i++;
 71         }
 72          int j;
 73          j=31;
 74         for(i=0;i<s.length;i++) {
 75                 y[j]=s[i];
 76                 j--;
 77             }
 78         y[0]=1;
 79         System.out.println();
 80        System.out.println("原码:");  //输出原码
 81        for(i=0;i<y.length;i++) {     //符号位为1
 82            System.out.print(y[i]);
 83               if((i+1)%4==0) {
 84                   System.out.print(" ");
 85             }
 86         }
 87        System.out.println();
 88        System.out.println("反码:");  //输出反码
 89        for(i=(y.length-1);i>=0;i--) {  //符号位不变,其他数位取反
 90            if(y[i]==0) {
 91                f[i]=1;
 92            }else {
 93                f[i]=0;
 94            }
 95        }
 96        f[0]=1;
 97        for(i=0;i<f.length;i++) {
 98            System.out.print(f[i]);
 99               if((i+1)%4==0) {
100                   System.out.print(" ");
101             }
102        }
103        System.out.println();
104        System.out.println("补码:");  //输出补码
105        i=31;
106        f[31]=f[31]+1;
107        while(i>=0) {    //转换为补码  在反码基础上+1
108            if(f[i]==2) {
109                f[i]=0;
110                f[i-1]=f[i-1]+1;
111            }else
112            {
113                f[i]=1;
114            }
115            i--;
116        }
117        
118        for(i=0;i<f.length;i++) {
119            System.out.print(f[i]);
120               if((i+1)%4==0) {
121                   System.out.print(" ");
122             }
123         }
124         
125     }
126         
127 }
128 }

运行结果如下:

请输入一个整数:
-32

原码:
1000 0000 0000 0000 0000 0000 0010 0000
反码:
1111 1111 1111 1111 1111 1111 1101 1111
补码:
1111 1111 1111 1111 1111 1111 1110 0000

请输入一个整数:
32

原码:
0000 0000 0000 0000 0000 0000 0010 0000
反码:
1111 1111 1111 1111 1111 1111 1101 1111
补码:
0000 0000 0000 0000 0000 0000 0010 0000

收获:

正整数的原码,反码,补码没有特殊地方,不需要特别记忆;但是对于负整数的原码要注意符号位为1,并且要转换为正整数之后再求二进制,对于反码,注意除去符号位之外的其他位数取反,反码在反码基础上加一(注意不要忘记按照二进制计算)。

猜你喜欢

转载自www.cnblogs.com/cxy0210/p/11540918.html