用C表示负数?

C如何表示负整数?

是通过二进制补码表示还是使用MSB(最高有效位)?

-1十六进制为ffffffff

所以请为我澄清一下。

回答:

ISO C(C99 section 6.2.6.2/2在这种情况下,但会延续到标准(a)的后续迭代)指出,实现必须为整数数据类型选择两种不同的表示形式之一,即二进制补码,二进制补码或符号/幅度(尽管这是难以置信的)两者的互补实现可能远远超过其他实现)。

在所有这些表示中,正数是相同的,唯一的区别是负数。

要获得正数的负表示,您:

将所有位取反,然后再加一个二的补码。

将所有位取反以补充。

仅将符号位反转为符号/幅度。

您可以在下表中看到它:

编号 补码| 补语| 符号/幅度

=================================================== = | ====================

5 | 0000 0000 0000 0101 | 0000 0000 0000 0101 | 0000 0000 0000 0101

-5 | 1111 1111 1111 1011 | 1111 1111 1111 1010 | 1000 0000 0000 0101

请记住,ISO并不要求在表示中使用所有位。他们介绍了符号位,值位和填充位的概念。现在,我从未真正看到过带有填充位的实现,但是,从C99基本原理文档中,他们有以下解释:

假设一台机器使用一对16位short(每个都有自己的符号位)组成一个32位int,而在此32位int中使用时,低位short的符号位被忽略。然后,作为32位带符号的int,在确定32位带符号的int的值时会有一个填充位(在32位中间)。但是,如果将此32位项目视为32位unsigned int,则该填充位对用户程序可见。C委员会被告知,有一台以这种方式工作的机器,这就是向C99添加填充位的原因之一。

我相信他们所指的机器是Datacraft 6024(它是Harris Corp的继任者)。在这些机器中,您有一个用于带符号整数的24位字,但是,如果您想使用更宽的类型,它会将其中两个作为47位值串在一起,而其中一个字的符号位被忽略:

+---------+-----------+--------+-----------+

| sign(1) | value(23) | pad(1) | value(23) |

+---------+-----------+--------+-----------+

\____________________/ \___________________/

upper word lower word

(a)有趣的是,由于实际上很少使用其他两种方法的现代实现方式,人们一直在推动将二进制补码作为一种真正的方法来接受。这在C ++标准中已经走了很长一段路(WG21是负责此工作的工作组),现在显然也考虑将其用于C(WG14)。

以上是 用C表示负数? 的全部内容, 来源链接: utcz.com/qa/419411.html

回到顶部