【问题标题】:Finding the difference between a negative and positive binary Number找出负二进制数和正二进制数之间的差异
【发布时间】:2019-06-03 06:04:25
【问题描述】:

我知道我们可以用多种方式表示二进制数,但我真的不知道如何区分正二进制数和负二进制数。

如果我们有数字+13,那么它的二进制表示是这样的: 1101

它的否定表示是这样的:

11101

我的理解是,如果你需要区分它们,那么0的存在在数字+13中很重要:

01101

即便如此,我还是分不清:

11101 ///Here is the representation of -13

和:

11101 ///Here is the representation of +29

我知道这里使用了另一种称为“二进制补码”的方案,我需要应用它。

如何区分这两种二进制表示?

【问题讨论】:

  • 你不能,除非你知道程序中使用的确切类型。请注意11011 可能不是负数,因为1 是所用类型大小的最高有效位。例如,-1 和 255 有歧义,因为它可以写成 11111111
  • 这取决于它的使用方式,例如使用什么机器指令来处理它。 11011 是无符号数、二进制补码还是符号/大小数?只是因为它的二进制表示是11011,你不知道。哎呀,它甚至可能不代表一个数字,而是完全不同的东西。
  • 看看这个相关的帖子:stackoverflow.com/questions/2931630/…
  • 11011 表示“有符号幅度”,这是表示负号的一种方式(不常见)。其他方式是二进制补码(最常见)和一个补码(不常见)。更糟糕的是,C 允许所有三种形式。但现实世界的计算机几乎只使用二进制补码。
  • 1011 二进制是十进制的 11,而不是 13。

标签: c binary


【解决方案1】:

正如其他人所说的那样,我可以区分这两种二进制表示是没有意义的。位序列是中性的,当您将其转换为数字时,您将针对给定的表示进行转换。它可以表示 intunsigned intfloat 或任何你想要的。就像如果我问你什么是coin,这个词在英语和法语中存在(至少?)具有完全不同的含义(法语单词coin的意思是英文),要回答我你需要选择一种语言,没有你不能回答。

关于“二的补码”,它是兼容我们CPU中使用的标准表示来改变signed int的符号的方式。 第一个补码是将所有0替换为1,将所有1替换为0,第二个补码是将前一个结果加1。

假设字有 5 位,int 值 13 是二进制的 01101。如果我们想要 -13,则 13 的 第一个补码得到 10010,加 1 得到 10011。

但仍然有 5 位字,unsigned int 的 10011 对应于值 19。

对于一个 5 位的 int,根据定义,如果我们尝试改变它的符号,则较低的负数是 10000:第一个补码 = 01111,加 1 = 10000!其实有溢出,5位是不够的。

【讨论】:

  • 我现在不明白了。
  • coin 在法语中也是鸭子的叫声。我不得不提到这一点。
【解决方案2】:

根据上下文,相同的位序列可能具有完全不同的含义。

整数类型具有固定位数 - C 语言定义要求带符号的int 类型必须能够表示至少范围[-32,767...32,767],这意味着int 必须至少 16 位宽1

有几种不同的方式来表示有符号整数。最常见的是 2 的补码,但某些架构可能使用 1 的补码或符号幅度。

要翻转 2 的补数上的符号,请按位取反并加 1(此示例假定 8 位整数):

00001101 == 13
11110010 + 1 == 11110011 == -13

11110011 == -13
00001100 + 1 == 00001101 == 13

2 的补码的主要优点之一是您对 0 有一个单一的表示形式,并且它为您提供了更广泛的值范围 - [-2<sup>n-1</sup>..2<sup>n-1</sup>-1]

要翻转 1 的补数上的符号,您只需按位取反:

00001101 == 13
11110010 == -13

11110010 == -13
00001101 == 13

使用 1 的补码,0 - 0000000011111111 的正负表示 - 范围为 [-2<sup>n-1</sup>-1..2<sup>n-1</sup>-1]

使用符号幅度,您可以将值位保持原样并翻转符号位:

00001101 == 13
10001101 == -13

与 1 的补码一样,您会得到正负 0 的两种编码 - 0000000010000000

无符号整数类型与有符号整数类型具有相同的宽度,它们的范围是[0..2<sup>n</sup>-1]

因此,位序列11110011 可以表示 2 的补码中的 -13、1 的补码中的 -12、符号幅度的 -115 或 243 无符号。


  1. 请注意,某些体系结构可能使用填充位,因此表示 32,767 需要超过 16 位。

【讨论】:

  • 不错的答案。 MIsc:它的1s 一个补码 不是1's,但2's 可以用于二的补码。由于填充,unsignedn values bits 可能比 intn 少一个,但我怀疑系统是否会再次尝试。
【解决方案3】:

二进制值对编码开放。

1101

当没有编码符号位时,

11012 的值为 1310

当使用符号位时,宽度 N 也很重要。
N &gt; 4, 使用2's complement1s' complementsign magnitude,值还是1310

11101

如果111012 保存在大小为 5 或更大的 unsigned 字段中,则值为 2910

如果 111012 保存在 5 位 signed int 字段中,则该值取决于 int 编码(肯定是 2 的补码)。

2 的补码:-310
1 的补码:-210
符号幅度:-1310(显然是OP的初始视图)

【讨论】:

    猜你喜欢
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 2021-12-22
    • 2021-11-04
    • 2019-06-16
    • 2021-03-08
    • 1970-01-01
    相关资源
    最近更新 更多