Java学习--反码 原码 补码简析

关于课上实验中对小数的处理中出现的问题涉及到原码,反码,补码的问题,所以在网上进行了一下搜索。
在原码,反码,补码中的解释可得知,无论是哪一种码,能够表示的数的范围是-2^(位数-1)-1至2^(位数-1)-1;

原码:二进制的在最高位数若为1, 则表示这个数为负数,最高位数为0,表示负数,其值大小就是最高位数除外的二进制转换成10进制的大小,最高位数表示符号;

反码:二进制的在最高位数若为1, 则表示这个数为负数,最高位数为0,表示负数,正数的值就是最高位数除外的二进制转换成10进制的大小,负数的值是正数按位取反的值。

补码:二进制的在最高位数若为1, 则表示这个数为负数,最高位数为0,表示负数,正数的值就是最高位数除外的二进制转换成10进制的大小,负数的值是正数按位取反的值在加上1所得的值。

假如有一计算机,是4位,那对这4位进行计算。通过了解,可以取-7至7的值。
假如有两个数5,-1,计算他们的加法;

原码:
5/2=2...1;
2/2=1...0;
1/2=0...1;
即5用二进制表示0101;
-1用二进制表示1001;
原码5+(-1)则表示 1110;
表示-6;
所以原码不能用来计算

反码:
5用二进制表示0101;
-1用二进制表示1110;
两数相加,0011(位数超过4的部分舍去);
表示3;
反码同样不能用来计算。

补码:
5用二进制表示0101;
-1用二进制表示1111;
两数相加,用二进制表示:0100;
表示4;
此时表达正确,故计算机是用补码表示加减。

在程序中测试的代码如下:

package wei;

public class Wei {

    public static int getString(String a)
    {
        int a1=0;
        for(int i=0;i<4;i++)
        {
            if(a.charAt(3-i)==‘1‘)
                a1+=(1<<(i));
        }
//        if(a.charAt(0)==‘1‘)
//            a1=-a1;
        return a1;

    }
    public static int add(int a,int b)
    {
        int c=0;
        c+=(((a+b)&8)>>3!=1)?((a+b)&7):-((a+b)&7);
        return c;
    }
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        String a=new String("0101");
        String b=new String("1001");
        System.out.println("原码表示5+(-1)="+add(getString(a),getString(b)));
        b="1110";
        System.out.println("反码码表示5+(-1)="+add(getString(a),getString(b)));
        b="1111";
        System.out.println("补码码表示5+(-1)="+add(getString(a),getString(b)));
    }

}

实验截图如下:

原文地址:https://www.cnblogs.com/halone/p/9745757.html

时间: 2024-10-13 07:34:11

Java学习--反码 原码 补码简析的相关文章

反码原码补码

原码:如果机器字长为n,那么一个数的原码就是用一个n位的二进制数,其中最高位为符号位:正数为0,负数为1.剩下的n-1位表示该数的绝对值. 反码:反码就是在原码的基础上,符号位不变其他位按位取反(就是0变1,1变0)就可以了. 补码:在反码的基础上按照正常的加法运算加1. 原文地址:https://www.cnblogs.com/adret/p/9751144.html

定点数表示方法——原码,补码,反码,移码

1. 真值和机器数 真值:数的实际值,用正负号和绝对值的某进制形式来表示,如+1010,-12,-FFFF等. 机器数:真值在计算机中的二进制表示,特点是符号数字化且数的大小受机器字长限制,其表示形式有原码,补码,反码,移码等. 2. 原码. 1). 定点小数: \[{x_{[{\rm{原}}]}} = \left\{ {\begin{array}{*{20}{l}}{x,0 \le x < 1}\\{{2^0} - x = {2^0} + \left| x \right|, - 1 < x

二进制的原码补码和反码

二进制的最高位为符号位,其中0表示正数,1表示负数: 正数的原码补码反码都是相同的: 负数的反码是负数的符号位不变,其余位取反(即1变0,0变1): 负数的补码是反码加1: 举例:计算机字长为八位,所以转换一下, 正一的原码:0000 0001 反码:0000 0001 补码:0000 0001 (均相同) 负一的原码:1000 0001(最高位的1表示为负数) 反码:1111 1110(最高位的符号位不变,其余取反) 补码:1111 1111(反码加一) 原文地址:https://www.cn

C语言实现原码补码输出

今天复习了一下C中的原码补码的知识,顺便编程使用for , while, do-while,goto,recursive 实现了补码和原码的输出. 核心思想: 借助一个字符串数组,将得到的原码和补码存储到相应数组中去.在计算原码的时候,由于存在负数的补码等于原码取反+1的这么一个关系,因而只要计算一个在计算机内部存贮着的补码就可以了.而获取补码的方式很简单,只需要依次做位与操作,逐个取出即可. ps: 这个版本的代码 可以很好的兼容 int short long等数据类型的输出 // =====

Pig源码分析: 简析执行计划的生成

摘要 本文通过跟代码的方式,分析从输入一批Pig-latin到输出物理执行计划(与launcher引擎有关,一般是MR执行计划,也可以是Spark RDD的执行算子)的整体流程. 不会具体涉及AST如何解析.如何使用了Anltr.逻辑执行计划如何映射.逻辑执行计划如何优化.MR执行计划如何切分为MR Job,而是从输入一批Pig DSL到待执行的真正执行计划的关键变化步骤(方法和类). 执行计划完整解析 入口处书Main类的main函数 /** * The Main-Class for the

java二进制,原码、反码、补码、位运算

1.二进制计数法的概念 人们在日常生活中和生产实践中,我们接触到越来越多的数字,创造了分组计数的制度.而我们的生活中,一般采用了"满十进一"的十进制计数法, 我们现在已经熟悉并经常运用这一种计数法了.但也有采用其他计数法.如二进制,六进制,十六进制等计数法.现在就来讲一讲"二进制"和"十进制"的关系 2.十进制和二进制数的互化 (1)化十进制数为二进制数 <1>比较小的十进制数为二进制数可以用观察法. 例:化45为二进制数 因为2的0

java基础:原码反码补码

计算机在操作的时候,都是采用数据对应二进制的补码来计算的: 原码 反码 补码 原码:用原码,反码,补码来分别表示+7,和-7. 首先得到7的二进制:111

原码 补码 反码

一.原码 正数的原码就是它的本身 假设使用一个字节存储整数,整数10的原码是:0000 1010 负数用最高位是1表示负数 假设使用一个字节存储整数,整数-10的原码是:1000 1010 二.反码 正数的反码跟原码一样 假设使用一个字节存储整数,整数10的反码是:0000 1010 负数的反码是负数的原码按位取反(0变1,1变0),符号位不变 假设使用一个字节存储整数,整数-10的反码是:1111 0101 三.补码(再次强调,整数的补码才是在计算机中的存储形式.) 正数的补码和原码一样 假设

原码补码反码

#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <stdio.h> char stry[33] = { 0 }; char strf[33] = { 0 }; char strb[33] = { 0 }; void bcode(int num) { unsigned int data = 1 << 31;//左移31位 for (int i = 1; i <= 32; i++) { if (