找出正负二进制数之间的差异

时间:2019-01-08 14:10:45

标签: c binary

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

如果我们有数字+13,则其二进制表示形式如下: 1101

及其否定表示如下:

11101

我了解的是,如果您需要区分它们,那么0的出现在数字+13中很重要:

01101

即使如此,我仍然无法区分:

11101 ///Here is the representation of -13

和:

11101 ///Here is the representation of +29

我知道这里使用了另一个称为“二进制补码”的方案。

如何区分这两个二进制表示形式?

3 个答案:

答案 0 :(得分:3)

正如其他人所说的那样,问题我可以区分这两个二进制表示形式吗?位序列是中性的,将其转换为数字时,将对给定表示进行转换。它可以表示一个 int ,一个 unsigned int ,一个 float 或您想要的任何内容。就像我问你什么是 coin ,这个词在英语和法语中存在(至少?),其含义完全不同(法语单词 coin 的意思是 corner (英语),要回答我,您需要选择一种语言,否则就无法回答。

关于“二进制补码”,它是与我们的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位是不够的。

答案 1 :(得分:1)

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

整数类型具有固定的位数-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的单一表示形式,并且可以为您提供更宽范围的值-[-2n-1..2n-1-1]

要翻转1的补码上的符号,只需执行按位取反操作即可:

00001101 == 13
11110010 == -13

11110010 == -13
00001101 == 13

使用1的补码,您可以分别得到0和0000000011111111的正负表示形式,范围为[-2n-1-1..2n-1-1]

使用符号幅度时,将值位保持不变,并翻转符号位:

00001101 == 13
10001101 == -13

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

无符号整数类型与有符号整数具有相同的宽度,其范围为[0..2n-1]

因此,位序列11110011的含义是2的补码中的-13、1的补码中的-12,符号幅度为-115或243无符号。


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

答案 2 :(得分:0)

二进制值对编码开放。

1101

当没有编码符号位时,

select * from movie where not exists ( select * from ScreeningRoom where not exists( select * from Screening where movies.movie_id=screeing.Movie_fid and ScreeningRoom.ScreeningRoom_Number=Screening.Screening_id having count(Screening.Screening_id) >1 ) ) group by movie.title 2 的值为13 10

使用符号位时, width 1101也很重要。
N时, 使用2's complement1s' complementsign magnitude,该值仍为13 10

11101

如果N > 4 2 保存在大小为5或更大的11101字段中,则值为29 10

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

2的补码:-3 10
1的补码:-2 10
符号幅度:-13 10 (显然是OP的初始视图)