• 关于源码,反码,补码(正数--负数)---------(-128)自己的理解


    以一个字节为例

    1、无符号位,一个字节可以存放0~255共256个数字;有符号位存放-128~127共256个数字;

    2、无符号全都表示为正数;有符号位则首位表示正负数,正数首位为0,负数首位为1(因此在判断一个数为正还是负时会先看首位,如果为正直接算,如果为负还要经过求反码、源码)

    以下以默认的有符号位示例

    3、首先,要知道计算机中正数用源码表示,负数用其正数的补码表示;补码为源码的反码加一(如-1即为1的反码加一表示)

      1:0000 0001

       -1:1111 1111

      从1到-1的计算过程:0000 0001  取反码为  1111 1110

                 1111 1110   +1为补码  1111 1111

      因此-1表示为 1111 1111

    4、如果给你一个负数,要求你用二进制表示;

      第一:先判断这个负数是否溢出(不管正负都要判断),如果溢出就不能表示,如果要强制转换就会造成数据不一致,那么原始数据就会丢失;

         如果不溢出,就下一步;

      第二:先用二进制表示出其对应的绝对值(正数)的二进制源码;

      第三:根据源码求反码,源码取反(~源码);

      第四:根据反码求补码表示负数,反码+1;

    5、如果给你一个负数的二进制,求该二进制表示的负数为几;

      第一:先求补码,该负数的二进制-1;

      第二:根据补码求源码,补码取反(~补码);

      第三:将源码算出代表几;

     

    关于牛客网题目的理解(正确答案为 B)

    前言:不管什么都是按照上诉4、5计算;

    • 比如4,当正数溢出时,他还是会把源码先(扩容后:如原本只装1个字节,但是装不下就扩用2个字节表示)表示出来,然后从低位截取再判断正负再进行计算;
    • 当负数溢出时,他还是会将源码表示出来,然后根据规则算出补码,最后截取后存储。由于截取后数值就变啦,因此所表示的就不是原来的数了,至于表示几自己根据规则再算回去,有时甚至会变为正数就是这个原因;

     

    因此这道题我是这么做的:

    因为a为short类型,一共16位,表示128为:0000 0000 1000 0000

    b为byte类型,一共8位,将a强制转换后为:1000 0000

    为什么1000 0000表示-128呢,我自己的理解是:

    1. 首先首位为1,则表示为负数 ,负数用补码表示,所以1000 0000为补码
    2. 补码-1为反码,即0111 1111
    3. 反码取反,为1000 0000
    4. 1000 0000表示的的正值为27=128(这样既符合正负数表示方法,数学数值上也说得通,包括16位的10000000 00000000表示-32768等等也是这个道理);所以1000 0000表示-128

    总结:因此我认为通过负数二进制求其表示的数时,最后得出源码后,应该是求源码表示的正值;而1000 0000在byte中比较特别,因为它的补码与源码相同,所以最后得出源码时会比较懵逼,但如果记住这时该求正值就行了;以后自己按照这个计算方法计算便可以,方便好记

  • 相关阅读:
    ZOJ 1002 Fire Net (火力网)
    UVa OJ 117 The Postal Worker Rings Once (让邮差只走一圈)
    UVa OJ 118 Mutant Flatworld Explorers (变体扁平世界探索器)
    UVa OJ 103 Stacking Boxes (嵌套盒子)
    UVa OJ 110 MetaLoopless Sorts (无循环元排序)
    第一次遇到使用NSNull的场景
    NSURL使用浅析
    从CNTV下载《小小智慧树》
    NSDictionary and NSMutableDictionary
    Category in static library
  • 原文地址:https://www.cnblogs.com/qiong2017/p/7666156.html
Copyright © 2020-2023  润新知