我知道我们可以用几种方式表示二进制数,但我真的不知道如何区分正二进制数和负二进制数。
如果我们有数字+13
,那么它的二进制表示如下:1101
它的否定表示如下所示:11101
我所理解的是,如果需要区分它们,那么0
的存在在+13
的数目中是重要的:01101
虽然如此,我还是无法区分:11101 ///Here is the representation of -13
以及:11101 ///Here is the representation of +29
我知道这里使用了另一个方案,称为“二进制补码”,我需要应用它。
如何区分这两种二进制表示?
4条答案
按热度按时间zlhcx6iw1#
就像其他人说的问题 * 我能区分这两种二进制表示吗 * 没有意义。一个位序列是中性的,当你把它转换成一个数字时,你就对给定的表示进行了转换。它可以表示 int,unsigned int,float 或任何你想要的东西。这就像如果我问你什么是 coin,这个词存在(至少?)在英语和法语中具有完全不同的含义(法语单词 coin 在英语中的意思是 corner),要回答我,你需要选择一种语言,没有你就不能回答。
关于“二进制补码”,改变 signed int 的符号是与我们CPU中使用的标准表示法兼容的方式。* 第一补码 * 是将所有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位不够。
yvgpqqbh2#
相同的位序列可以基于上下文而具有根本不同的含义。
整数类型有固定的位数--C语言定义要求带符号的
int
类型必须能够表示 * 至少 *[-32,767...32,767]
的范围,这意味着int
必须 * 至少 * 16位宽1。有几种不同的方法来表示有符号整数。最常见的是2的补码,但有些架构可能使用1的补码或符号幅度。
若要翻转2的补数上的符号,请执行按位求反并加1(此示例假定为8位整数):
2的补码的主要优点之一是0只有一种表示形式,它提供的值范围稍宽-
[-2n-1..2n-1-1]
要翻转1的补数的符号,只需执行按位求反:
使用1的补码,可以得到0 -
00000000
和11111111
-的正和负表示,范围为[-2n-1-1..2n-1-1]
使用符号幅度时,保留值位不变,翻转符号位:
与1的补码一样,正负0有两种编码-
00000000
和10000000
。无符号整数类型的宽度与有符号整数类型的宽度相同,范围为
[0..2n-1]
。因此,位序列
11110011
可以表示2的补码中的-13、1的补码中的-12、符号-幅度中的-115或无符号的243。1.注意,一些体系结构可以使用填充位,使得需要多于16位来表示32,767。
vhmi4jdf3#
二进制值对 encoding 开放。
1101
1101
2的值为1310。当使用符号位时,width
N
也很重要。当
N > 4
时,用2's complement,1 s '补数,符号幅度,其值仍为1310。11101
如果
11101
2保存在大小为5或更大的unsigned
字段中,则值为2910。如果
11101
2保存在5位signed int
字段中,则该值取决于int
编码(当然是2的补码)。二进制补码:-310
1 s '补码:-210
符号大小:-1310(显然是楼主的初始观点)
i34xakig4#
假设您有一台5位计算机。5位分为1个符号位+4个数字位。限制为2^4-1到-2^4,即15到-16.13 =01101 -13= 10010:2的补码表示法。它不会是18,因为18不适合这个范围。