• 原码,补码,反码区分


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

    原码:是最简单的机器数表示法。用最高位表示符号位,‘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,并且要转换为正整数之后再求二进制,对于反码,注意除去符号位之外的其他位数取反,反码在反码基础上加一(注意不要忘记按照二进制计算)。

  • 相关阅读:
    Lazarus中system.length说明
    Lazarus中TScreen类使用介绍
    Delphi深度探索-CodeSite应用指南
    Lazarus如何变成XE的界面
    Lazarus IDE的几个小技术
    Delphi结构体数组指针的问题
    delphi动态数组指针问题
    delphi 数组类型与数组指针的巧妙利用
    Delphi Form的释放和隐藏:free,hide,close
    Delphi 记录类型- 结构指针
  • 原文地址:https://www.cnblogs.com/cxy0210/p/11540918.html
Copyright © 2020-2023  润新知