代码之家  ›  专栏  ›  技术社区  ›  Takeru

转换二进制、十进制、六进制等。bit的作用是什么?

  •  0
  • Takeru  · 技术社区  · 12 年前

    如果我在16位系统上得到1101001000100010,并想将其转换为十进制,结果是-11742(老师告诉我)

    但如果我在计算器中输入二进制数,我得到53794。

    为什么会出现这种情况?系统(8位、16位、32位、64位)是如何影响这一点的?

    我试着用手转换二进制数(2+32+512+4096+16384+32768=53794),但只是为了确认我的计算器。。。。

    5 回复  |  直到 12 年前
        1
  •  1
  •   takwlasnie    12 年前

    这是因为计算机模拟是基于 two's complement

    你应该读一下 method of colpement

    例如,在补码十进制数中,自然减法看起来是这样的(使用4位数字):

    0000
    0001 -
    9999 =
    

    很明显,它是-1,因为在互补系统中,第一个数字(当然,在big-endian中,你应该熟悉 endianness )定义符号。例如,在十进制补码中,4是4,4是3,2是2,1是1,0是0,9是-1,8是-2,7是-3,6是-4,5是-5。

    这是因为在补数系统中,您总是对相同数量的数字进行运算,但除了忽略溢出结果外,您总是在进行加法和减法运算。例如,使用两个十进制数字:

          04
          05 -
     ...9999 =
    

    正如我所说,结果只有两位数(我们加了两位数),所以结果是99。正如我之前提到的,第一个数字被解释为-1(而不是9)。因为它是位置数字系统,我们可以很容易地将这个结果转换为我们的普通十进制,只需将数字乘以正确的十次方即可:

    10^1 * 9 + 10^0 * 9
    //as I told - first nine is -1 so:
    10^1 * -1 + 10^0*9 = -10 + 9 = -1
    

    现在尝试第一个结果:

    9999 = 9 * 10^3 + 10^2 * 9 + 10^1 * 9 + 10^0 * 9
    //first nine is -1 so:
    -1 * 10^3 + 999 = -1000 + 999 = -1
    

    现在在二进制中,它要简单得多,因为第一个数字只是告诉符号是什么。尝试使用8位数字:

    1111 1111

    这显然是-1,因为如果我们加1,结果将是0。你可以说我在撒谎,因为你可以简单地添加以下内容:

      1111 1111
      0000 0001 +
    1 0000 0000 =
    

    但在补码系统中是不正确的。这是因为在补码系统中,第一个数字不仅描述了数字的符号,而且所有的数字都可以被这个数字无限扩展!这就是id补码十进制99=999的原因!这也意味着我们可以轻松地将8个字节的数量扩展到例如32个字节!

    例如,尝试使用数字17和-1。您现在已经熟悉了-1。在8字节中,二的复数-1是:

    1111 1111

    扩展到32字节,它为我们提供了:

    1111 1111 1111 1111 1111 1111 1111 1111

    要将其转换为普通十进制,我们需要进行2^31+2^30+…+2^0,但(正如我所提到的)第一个1是-1,所以它正好是-1*2^31+2^30+..+2^0如果你计算这个,它正好是-2147483648+2147483647=-1!

    0001 0001(十进制17)

    扩展到32口可提供:

    0000 0000 0000 0000 0000 0000 0001 0001

    我们可以同意现在仍然是17:)

    为了说明我不是什么疯子,只是一个IT学生,我将展示恰恰能做到这一点的C++代码:

    #include <iostream>
    using namespace std;
    int main(void)
    {
        char eightBits = 255; //eightBits := 0x11111111
        int eightBytes = eightBits; //eightBytes becaming 255, right?
        cout <<eightBytes <<endl; // MAGIC ! 
        return 0;
    }
    
        2
  •  1
  •   Chris Forrence Shreya Gupta    12 年前

    基本上,这取决于有多少空间。最高有效位用于确定数字是否为负数。

    在32位系统中,以下两个数字是等效的:

    1101 0010 0010 0010
    0000 0000 0000 0000 1101 0010 0010 0010
    

    作为一个有符号的16位值,开头的1表示它是一个负数。要获得其值,请翻转每一位,然后加一位。

    1101 0010 0010 0010
    0010 1101 1101 1101
    0010 1101 1101 1110
    = 11742
    

    作为 无符号的 16位值,所有16位都用于确定幅度。这将导致53794人。

    Reference

        3
  •  0
  •   williambq    12 年前

    这里的未发音部分是关于符号的。它存储在前端,表示符号。

    http://www.binaryconvert.com/result_signed_short.html?decimal=045049049055052050

    更简洁地说,在大多数系统中,16位的“字”或整数通常被称为“短”,表示32768到+32767之间的有符号数字。这是你的老师所指的“二进制”数字,它不是直接作为二进制数字存储的,而是以二进制格式存储的。实际上,只有15个点可以存储该值,并且必须为符号保留一个点。否则,一个无符号值可以使用所有16个点作为数字,因此可以从0到+665535。

        4
  •  0
  •   Mehmet K    12 年前

    二进制数字有不同的表示方式:

    • 未签名(您正在做的事情)
    • 签署
    • 1的补码
    • 2的补语(根据你的老师你应该做什么)

    数字系统通常使用2的补码表示。

    要获取二进制数的十进制数,请使用2的补码:
    1.第一位是符号位。如果数字以0开头,则为正,否则为负。
    2.如果数字是正数,则其十进制值是除符号位之外的其余位的无符号值。如果数字为负数,则其绝对十进制值=(剩余位的补码的有符号值)+1。

        5
  •  0
  •   supercat    12 年前

    在计算机中,通常通过假设最左边的比特被复制无限次来表示“二的补码”有符号数,从而将比特序列(1101 0010 0010)视为(1111…1111 1101 00100 0010)。尽管一个由1组成的无限字符串看起来像是一个无限大的数字,但在这样的字符串中加1将产生一个由0组成的无限串(即0)。因此,无穷一串1是1的加法逆,因此具有-1的有效值。一个由1和若干个零组成的无限字符串,将是单个1和该数目个零的加性倒数(因此在您的示例中,最左边的“1”的有效值为-32768,而不是+32768)。虽然将幂级数公式应用于1+2+4+8+16+32+64…得出-1的事实通常被认为是一种反常现象,但这与“二补”数学的工作方式是一致的。

    注意,虽然许多对二的补码数学的描述只是将最高位的“缩放因子”的符号描述为被反转(例如-32768而不是+32768),从用最左边的比特的副本进行左填充的角度思考,可以更容易地理解为什么有符号的数字表现得好像最左边的数字是重复的(例如,将负16比特整数转换为32比特整数会用1填充最左边的16比特)。