当前位置: 首页 > 面试题库 >

用C表示负数?

段干飞翔
2023-03-14
问题内容

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)。



 类似资料:
  • 问题内容: 我想使用二进制补码表示一位负整数。使用标准的Python位表示实用程序并没有多大帮助: 的补码形式为。我该怎么做呢? 问题答案: Python的整数已经使用二进制补码,但是由于它们具有任意精度,因此负数的二进制表示形式在开始时将具有一个无限的1s字符串,就像正数具有一个无限的0s字符串一样。由于显然无法显示,因此用负号代替。 如果您想要特定宽度的二进制表示形式,则可以使用模数。

  • 问题内容: 请帮我了解负整数的二进制表示形式。 例如,我们有5。5的二进制表示是。 而且据我了解,-5的二进制表示应该像。 但是输出是。 我有2个问题: 1)为什么这里有这么多位。 2)我真正无法理解的是最后3位。看起来像。即使是+1或-1这将是或 谢谢 问题答案: 您对这些负数应该是什么样的理解是有缺陷的。Java对负数使用二进制补码,而基本规则是取正数,将所有位取反然后加1。那给你带来负面影响

  • 我想将这个JSON反序列化为一个C#类,但我需要首先定义这个类: 我想将它反序列化为如下所示,但不确定我的JSON结构是否适合它: 我应该如何更改上面的JSON以适应下面的类,这样我就可以使用JsonConvert来反序列化它了? 谢了!

  • 我正在创建一个石头、布、剪刀的游戏,我想让它显示个人的赢、输和平局。 当我运行它时,它总是说我输了。 我认为问题是要增加正确值的if-then语句。 我认为最后一件事可能是生成计算机选择的方法。 我该怎么解决这个问题?

  • 链表是一系列通过链接连接在一起的数据结构。 链接列表是包含项目的一系列链接。 每个链接都包含与另一个链接的连接。 链表是数组后第二个最常用的数据结构。 以下是理解链表的概念的重要术语。 Link - 链接列表的每个链接都可以存储称为元素的数据。 Next - 链接列表的每个链接都包含指向下一个链接的链接。 LinkedList - LinkedList包含指向First的第一个Link的连接链接。

  • 我正在用PyGame创建一个游戏。在那里我想创造负面效果,所有的屏幕都变成负面。 这对于像rects这样的简单形状来说非常容易:(并使用而不是) 但我不知道如何在图像上产生这种效果。我试着做负片图像复制,但若这种效果不是即时的,会逐渐填满屏幕,那个么这将并没有帮助。