C语言 求负二进制数和正二进制数的差

6ju8rftf  于 2022-12-11  发布在  其他
关注(0)|答案(4)|浏览(339)

我知道我们可以用几种方式表示二进制数,但我真的不知道如何区分正二进制数和负二进制数。
如果我们有数字+13,那么它的二进制表示如下:1101
它的否定表示如下所示:
11101
我所理解的是,如果需要区分它们,那么0的存在在+13的数目中是重要的:
01101
虽然如此,我还是无法区分:
11101 ///Here is the representation of -13
以及:
11101 ///Here is the representation of +29
我知道这里使用了另一个方案,称为“二进制补码”,我需要应用它。
如何区分这两种二进制表示?

zlhcx6iw

zlhcx6iw1#

就像其他人说的问题 * 我能区分这两种二进制表示吗 * 没有意义。一个位序列是中性的,当你把它转换成一个数字时,你就对给定的表示进行了转换。它可以表示 intunsigned intfloat 或任何你想要的东西。这就像如果我问你什么是 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位不够。

yvgpqqbh

yvgpqqbh2#

相同的位序列可以基于上下文而具有根本不同的含义。
整数类型有固定的位数--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。

vhmi4jdf

vhmi4jdf3#

二进制值对 encoding 开放。

1101

11012的值为1310。
当使用符号位时,widthN也很重要。
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(显然是楼主的初始观点)

i34xakig

i34xakig4#

假设您有一台5位计算机。5位分为1个符号位+4个数字位。限制为2^4-1到-2^4,即15到-16.13 =01101 -13= 10010:2的补码表示法。它不会是18,因为18不适合这个范围。

相关问题