• 什么是补码-网上找到的,非原创


    反码,没有用途;补码,有把减法转换成加法的用途。
    ----
    日常生活中,大家都知道,把时针倒拨20分钟,和正拨40分钟,效果是相同的。
    -20,就对应了 +40。
    怎么算的?用 60 减去 -20 的绝对值,即可。
    ----
    另外,100 以内的数字,减去1,和加上 99,效果也是相同的。
    比如,27 - 1 = 26,  27 + 99 = (1) 26。
    即 -1,就对应了 +99。
    怎么算的?用 100 减去 -1 的绝对值,即可。
    ----
    这些,就体现了《模》与《补数》的概念。
    利用补数,就可把减法,转换成加法。如果是正数,直接做加法就行,不用费事。
    ----
    对于负数,要用《模》减去这个负数的绝对值,求出《补数》之后再用于计算。
    对于正数,就不用变了。
    ----
    八位二进制数字的《模》是 1 0000 0000,即 256。
    -5 的补数就是:256 - 5 = 251。
    ----
    把 5、251,都写成二进制数,这就称为了《码》,此时就可以看出它们有《求反加一》的关系。
    即把 5 = 0000 0101,求反加一,就有:1111 1011,这就是 -5 的补码,这也就是 251。
    ----
    八位时,补码定义式如下:
    [X]补 = X ;0 =< X =< 127
    [X]补 = 256 - | X | ;128 =< X < 0
    严谨一些的书上都有这个式子。
    ----
    补码完全可以用十进制数表示,编程时,就写十进制数,保证都是正确的。
    补码,不必变成二进制,也就不用《求反加一》了,书上讲的那些步骤,都是垃圾。

    // 附上代码验证

     1 public void demo10(){
     2         byte b1 = (byte)-2;
     3         byte b2 = (byte)254;
     4         // 证明了 -2 的补码,就是正数254
     5         // 254 = 256(byte的模)-2(-2的绝对值)
     6         System.out.println(Integer.toBinaryString(b1));
     7         System.out.println(Integer.toBinaryString(b2));
     8         System.out.println(b1 == b2);
     9         //11111111111111111111111111111110
    10         //11111111111111111111111111111110
    11         // true
    12         
    13         int i1 = -199;
    14         int i2 = (Integer.MAX_VALUE+1)*2 - 199; // 其中 int 4 个 byte的模为(Integer.MAX_VALUE+1)*2 即2的32次方
    15         System.out.println(Integer.toBinaryString(i1));
    16         System.out.println(Integer.toBinaryString(i2));
    17         System.out.println(i1 == i2);
    18         //11111111111111111111111100111001
    19         //11111111111111111111111100111001
    20         //true
    21     }
  • 相关阅读:
    枚举enum
    C# 位运算符
    运算符&和&&以及|和||区别比较
    LINQ TO JSON
    LINQ 随机排序
    .NET Core LinQ
    CSharp笔记>>>多线程
    3D旋转
    CSharp 之CSkin的使用教程
    CSharp笔记>>>多语言,注册,模态对话框返回值
  • 原文地址:https://www.cnblogs.com/jianglong-liang/p/3322425.html
Copyright © 2020-2023  润新知