我知道我们可以用几种方式表示二进制数,但是我真的不确定如何区分正数和负数。
如果我们有数字+13
,则其二进制表示形式如下:
1101
及其否定表示如下:
11101
我了解的是,如果您需要区分它们,那么0
的出现在数字+13
中很重要:
01101
即使如此,我仍然无法区分:
11101 ///Here is the representation of -13
和:
11101 ///Here is the representation of +29
我知道这里使用了另一个称为“二进制补码”的方案。
如何区分这两个二进制表示形式?
答案 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和00000000
和11111111
的正负表示形式,范围为[-2n-1-1..2n-1-1]
使用符号幅度时,将值位保持不变,并翻转符号位:
00001101 == 13
10001101 == -13
与1的补码一样,您将获得正负0的两种编码-00000000
和10000000
。
无符号整数类型与有符号整数具有相同的宽度,其范围为[0..2n-1]
。
因此,位序列11110011
的含义是2的补码中的-13、1的补码中的-12,符号幅度为-115或243无符号。
答案 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 complement,1s' complement,sign 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的初始视图)