📜  不同数据类型范围的有符号二进制数的基础知识

📅  最后修改于: 2021-09-27 14:45:47             🧑  作者: Mango

有符号二进制数的核心概念和不同数据类型范围的解释。如果我问十进制 (1000 0000) 2的值是多少,那么肯定会出现两个模棱两可的答案 (-128) 10和 (+128) 10

答案确实模棱两可,因为两个答案都是正确的。
因此出现了有符号数和无符号数的概念来帮助克服歧义。

现在,如果给出无符号数,则 (+128) 10是正确答案,因为在无符号数的情况下没有符号位。因此,此处不保留 MSB(最高有效位)来表示数字符号。

但如果给出的是有符号数,则 (-128) 10是正确答案。
在有符号数字的情况下,保留 MSB 来表示数字的符号。
因此,如果数字为 n 位,则在这 1 位中用于表示数字的符号,其余 (n-1) 位用于表示数字的大小。

表示有符号数的方法:

  • 签署幅度表
  • 1的补充表格
  • 2的补充表格

这些解释如下。

  1. 签名量表:
    这里,MSB 是为有符号位保留的,通过使用剩余的 (n-1) 位,我们可以使用正常的二进制到十进制转换公式(通过乘以 2i,其中 i 代表 LSB(最低有效位)的索引位置)直接得到十进制值))。请注意,索引从 LSB 端的 0 开始,而不是 1。
  2. 1的补码形式:
    此处,MSB 保留用于有符号位,其余 (n-1) 位以数字的 1 的补码形式存储。

    我的意思从下面的例子中会很清楚:

    考虑使用 1 的补码中的 4 位来表示 -7。
    这里给出了 4 位,所以保留 1 位 MSB 来表示符号。所以,现在我们只剩下 3 位了。
    我们知道 (+7) 10 =(111 2 .

    但是给出了以1的补码形式存储数字,因此,计算了(+7)的1的补码。
    (+7) 10 =(000) 2 的1 的补码。 (因为计算 1 的补码是为了将零翻转为 1,反之亦然)。

    因此,最后是 (-7) 10 =(1000) 2 的1 的补码表示。 (使用 4 位)。

  3. 2的补码形式:
    此处,MSB 保留用于有符号位,其余 (n-1) 位以数字的形式 2 的补码形式存储。

    我的意思从下面的例子中会很清楚:

    考虑上面解释的相同示例,即使用 4 位表示 -7,但现在使用 2 的补码。
    这里给出了 4 位,所以保留 1 位 MSB 来表示符号。所以,现在我们剩下 3 位。
    我们知道 (+7) 10 =(111) 2

    但是给出了以2的补码形式存储数字,因此计算了(+7)的2的补码。
    (+7) 10 的1 的补码 =(001)2。(因为 2 的补码用于将零翻转为 1,反之亦然)并将翻转位后得到的结果加 1。

    换句话说,

    因此,最终 2 的补码表示 (-7) 10 =(1001) 2 .(使用 4 位)。

    但是等等有歧义,怎么可以 (-128) 10 =(1000 0000) 2在 8 位 2 的形式有符号数?

    但诀窍就在这里,让我们认为我们不知道 (1000 0000) 2代表什么,然后将 (+127) 10添加到它,添加后我们得到的结果是 (1111 1111) 2 = (-1) 10 .因此,(1000 0000) 2的唯一可能值是 8 位 2 形式的有符号数中的 (-128) 10

    现在,这个概念在 2 的补码中是允许的,因为在 2 的补码中有(负 0)的概念。如果我们想通过取 (1000 0000) 2 的2 的补码来计算,那么在忽略 MSB(符号位)之后,数字的 1 的补码是(111 1111),2 的补码是(000 0000)。因此,幅度为 0,符号为负。我们应该得到的十进制数是 (-0) 但正如我已经说过的,在 2 的补码中没有(负 0)的概念。

    因此,这证实了 (-128) 10 =(1000 0000) 2

    编程语言中数据类型的范围可以用这个来解释。现在我们在 c++/ Java中的所有短(数据类型)都是 2 个字节,即 16 位,我们说范围是从 ( -32, 768 到 32, 767 )。现在,请注意正数范围到 -32, 768 但正数只到 32, 767 即负数范围大于正数范围(仅谈论双方的大小)但您可能会认为两者正负范围应该相同,但在这里它们不相同。

    很困惑为什么会这样?
    相同的原因是我上面解释的概念,因此负范围比正范围多 1 (1000 0000 0000 0000) 2是 (-32, 768) 10 。这个概念可以扩展到所有数据类型,这也是我们在编程语言中使用的所有数据类型范围背后的原因。