0

如果我在 16 位系统上有 1101 0010 0010 0010 并想将其转换为十进制结果是 -11,742(老师告诉我)

但是,如果我将二进制数输入我的计算器,我会得到 53794。

为什么会这样?系统(8 位、16 位、32 位、64 位)对此有何影响?

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

4

5 回答 5

1

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

在 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。

参考

于 2013-08-26T17:38:00.927 回答
1

这是因为计算机算法是基于二进制补码的

你应该阅读关于colpement 的方法

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

0000
0001 -
9999 =

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

这是因为在补数系统中,您总是在相同数量的数字上进行操作,但是除了忽略溢出结果之外,您总是像往常一样进行加减运算。例如有两个十进制数字:

      04
      05 -
 ...9999 =

正如我所说的结果只有两位数(我们添加了两位数),所以结果是 99。正如我之前提到的,第一个数字被解释为 -1(不是 9)。因为它是位置数字系统,我们可以轻松地将这个结果转换为我们的正常十进制系统,只需将数字乘以正确的 10 次幂相加:

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 = 9999 !这也意味着我们可以轻松地将 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;
}
于 2013-08-26T18:15:43.893 回答
0

There are different ways to represent binary numbers:

  • Unsigned (what you are doing)
  • Signed
  • 1's complement
  • 2's complement (what you are supposed to do according to your teacher)

Digital systems generally use 2's complement representation.

To get decimal number for a binary number in 2's complement:
1. First bit is the sign bit. If the number starts with 0, it is positive, otherwise it is negative.
2. If the number is positive, its decimal value is unsigned value of the remaining bits other than the sign bit. If the number is negative, its absolute decimal value = (signed value of the complement of the remaining bits)+1.

于 2013-08-26T17:46:30.687 回答
0

这里不为人知的一点是关于标志的。它存储在前端并表示符号。

http://www.binaryconvert.com/result_signed_short.html?decimal=04504904905505205​​0

更简洁地说,16 位“字”或整数在大多数系统上通常称为“短”,表示 -32,768 和 +32,767 之间的有符号数。这是您的老师所指的“二进制”数,它不是直接存储为二进制数,而是以二进制格式存储。实际上只有 15 个位置可以存储值,并且必须为标志保留一个位置。否则,无符号值可以使用所有 16 个点作为数字,因此可以从 0 变为 +65,535。

于 2013-08-26T17:36:51.140 回答
0

在计算机中,通常通过假设最左边的位被无限次重复来表示“二进制补码”有符号数,因此位序列(1101 0010 0010 0010)被认为是(1111....1111 1101 0010 0010 0010)。尽管无限的一串看起来像是一个无限大的数字,但在这样的字符串上加一将产生一个无限的零串(即 0)。因此,无限的一串是 1 的加法倒数,因此有效值为 -1。一个无限的一串后跟一些零,将是单个 1 后跟该数量零的加法倒数(因此在您的示例中,最左边的“1”的有效值为 -32768 而不是 +32768) . 虽然将幂级数公式应用于 1+2+4+8+16+32+64...

请注意,虽然对二进制补码数学的许多描述只是将最高位的“比例因子”的符号描述为被反转(例如 -32768 而不是 +32768),但考虑使用最左边位的副本进行左填充会更容易了解为什么有符号数字的行为就像最左边的数字是重复的一样(例如,将负的 16 位整数转换为 32 位整数会用 1 填充最左边的 16 位)。

于 2013-08-26T17:58:49.787 回答