zoukankan      html  css  js  c++  java
  • 正数负数的二进制表示

    一.问题来源

    "为毛   -x=!x+1  ???

    其中x为一任意int型正整数,左式表示取x的相反数后的二进制形式,右式表示先将x的二进制按位取反后再加一得到的二进制形式。

    左右两个二进制相同" 

    假设有一个 int 类型的数,值为5,那么,我们知道它在计算机中表示为: 

    00000000 00000000 00000000 00000101 
    5转换成二制是101,不过int类型的数占用4字节(32位),所以前面填了一堆0。 
    现在想知道,-5在计算机中如何表示? 
    在计算机中,负数以原码的补码形式表达。 
    什么叫补码呢?这得从原码,反码说起。 

    二.源码,反码,补码

    1.源码

    原码:一个正数,按照绝对值大小转换成的二进制数;一个负数按照绝对值大小转换成的二进制数,然后最高位补1,称为原码。

    比如 00000000 00000000 00000000 00000101 是 5的 原码。

    10000000 00000000 00000000 00000101 是 -5的 原码。

    2.反码:正数的反码与原码相同,负数的反码为对该数的原码除符号位外各位取反。

    取反操作指:原为1,得0;原为0,得1。(1变0; 0变1)

    比如:正数00000000 00000000 00000000 00000101 的反码还是 00000000 00000000 00000000 00000101 

    负数10000000 00000000 00000000 00000101每一位取反(除符号位),得11111111 11111111 11111111 11111010。 
    称:11111111 11111111 11111111 11111010 是 10000000 00000000 00000000 00000101 的反码。 
    反码是相互的,所以也可称: 
    10000000 00000000 00000000 00000101 和 11111111 11111111 11111111 11111010互为反码。 

    3.补码:正数的补码与原码相同,负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1. 

    比如:10000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010。 
    那么,补码为: 
    11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011 
    所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011。转换为十六进制:0xFFFFFFFB。 
    再举一例,我们来看整数-1在计算机中如何表示。 
    假设这也是一个int类型,那么: 

    1、先取-1的原码:10000000 00000000 00000000 00000001 
    2、得反码:     11111111 11111111 11111111 11111110(除符号位按位取反) 
    3、得补码:     11111111 11111111 11111111 11111111 


    可见,-1在计算机里用二进制表达就是全1。16进制为:0xFFFFFF 

    主要知识点: 


    正数的反码和补码都与原码相同。 
    而负数的反码为对该数的原码除符号位外各位取反。 
    负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1 

    下面是书上原文: 

    原码表示法规定:用符号位和数值表示带符号数,正数的符号位用“0”表示,负数的符号位用“1”表示,数值部分用二进制形式表示。 
    反码表示法规定:正数的反码与原码相同,负数的反码为对该数的原码除符号位外各位取反。 
    补码表示法规定:正数的补码与原码相同,负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1.
    正零和负零的补码相同,[+0]补=[-0]补=0000 0000B

    java中负数的二进制表示

    计算机对有符号数(包括浮点数)的表示有三种方法:原码、反码和补码,补码=反码+1。在二进制里,是用0和1来表示正负的,最高位为符号位,最高位为1代表负数,最高位为0代表正数。

            以java中8位的byte为例,最大值为:0111 1111,最小值为1000 0001。

            那么根据十进制的数字,我们如何转换为二进制呢?对于正数我们直接转换即可,对于负数则有一个过程。

            以负数-5为例:

           1.先将-5的绝对值转换成二进制,即为0000 0101;

           2.然后求该二进制的反码,即为 1111 1010;

           3.最后将反码加1,即为:1111 1011

           所以Java中Integer.toBinaryString(-5)结果为11111111111111111111111111111011. Integer是32位(bit)的.

    public class Test2 {
        public Test2(){
            int i=-5;
            System.out.println("i= "+i+" = "+Integer.toBinaryString(i)+"(B)");
        }
        
        public static void main(String[] args){
            new Test2();
        }
    }

     

  • 相关阅读:
    VC 常见问题百问
    python windows 环境变量
    Check server headers and verify HTTP Status Codes
    Where are the AES 256bit cipher suites? Please someone help
    outlook 如何预订会议和会议室
    安装Axis2的eclipse插件后,未出现界面
    windows 环境变量
    python 时间日期处理汇集
    openldap学习笔记(使用openldap2.3.32)
    set p4 environment in windows
  • 原文地址:https://www.cnblogs.com/lukelook/p/11274795.html
Copyright © 2011-2022 走看看