负数在C中的表示?

C代表负整数?

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

hex中的-1ffffffff

所以请为我澄清这一点。

ISO C(C99)第6.2.6.2/2节指出,实现必须为整型数据types,二进制补码,1的补码或符号/幅度select三种不同的表示之一(尽pipe远远不止这两个补码的实现超过其他)。

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

为了得到一个正数的负数表示,你:

  • 反转所有的位,然后添加一个补码。
  • 将所有的位反转。
  • 反转符号/幅度的符号位。

你可以在下面的表格中看到:

数字| 两个补码| 一些'补充| 符号/幅值
 ======= | ===================== | ==================== = | ====================
      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位短路(每个都有自己的符号位)组成一个32位整数,而在这个32位整数中使用下方短整数的符号位。 然后,作为一个32位有符号整数,有一个填充位(在32位中间),在确定32位有符号整数的值时忽略。 但是,如果这个32位的项目被视为一个32位的unsigned int,那么这个填充位对用户的程序是可见的。 C委员会被告知,有一台机器可以这样工作,这就是C99增加了填充位的原因之一。

我相信他们可能提到的机器是Datacraft 6024(它是哈里斯公司的接class人)。 在这些机器中,你有一个24位的字用于有符号的整数,但是,如果你想要更宽的types,它将其中的两个串在一起,作为一个47位的值,其中一个字的符号位被忽略:

 +---------+-----------+--------+-----------+ | sign(1) | value(23) | pad(1) | value(23) | +---------+-----------+--------+-----------+ \____________________/ \___________________/ upper word lower word 

C允许有符号整数的符号/大小,补码和二进制补码表示。 大多数典型的硬件使用二进制补码来表示整数和浮点数的符号/大小(还有另一种可能性 – 浮点指数的“偏差”表示法)。

hex中的-1是ffffffff。 所以请在这方面澄清我。

在二进制补码(迄今为止最常用的表示)中,除了最高有效位(MSB)之外的每个位从右到左(增加的数量级)具有值2n ,其中n从零增加1。 MSB的值为-2 n

因此,例如在一个8位二进制补码整数中,MSB的地址值为-2 7 (-128),所以二进制数:1111 1111 2等于-128 + 0111 1111 2 = -128 + 127 = -1

二进制补码的一个有用特征是处理器的ALU只需要一个加法器块来执行减法操作,通过形成右侧操作数的二进制补码。 例如10 – 6相当于10 +( – 6); 在8位二进制(为了简化说明),这看起来像:

  0000 1010 +1111 1010 --------- [1]0000 0100 = 4 (decimal) 

其中[1]是丢弃的进位位。 另一个例子; 10 – 11 == 10 +(-11):

  0000 1010 +1111 0101 --------- 1111 1111 = -1 (decimal) 

二进制补码的另一个特点是它有一个单一的值代表零,而符号和补码每个都有两个; +0和-0。

对于整数types,通常是二进制补码(具体实现)。 对于浮点,有一个符号位。

    Interesting Posts