如何区分负二进制数?

时间:2016-10-13 18:38:24

标签: c binary

假设我正在处理4位操作。所以如果我遇到一个二进制数字说

1111

然后我应该推断出什么?是-1还是15?

1 个答案:

答案 0 :(得分:2)

“这取决于”。

这些位(在这种情况下)编码一个数字,但你必须知道哪种数字(有符号或无符号,整数,定点或浮点数)才能解释编码位。

如果数字应该用二进制补码,那么正确的解释是-1,如果它是无符号的那么它是15。

单靠这四个位来决定是不可能的,这根本就没有足够的信息。

当然,对于“全尺寸”值也是如此,它可能是intunsigned int,您必须知道这是为了正确解释这些位。

更新:如果您知道您的号码应该被签名,那么处理它的最简单方法(假设C,通常没有签名) 4位整数类型)是符号扩展它为可用的形式。

符号扩展仅涉及获取较少位数的最高位,并将其重复到左侧直至(并包括)目标位的最高位。

所以在你的情况下,你有0xf,其最高位是1.扩展到int8_t,我们得到:

const int8_t number = 0xff;

这是-1。

没有内置的方法可以从任意几位数进行此符号扩展,因为C本身无法处理这些。

这是一种天真的方法:

// Sign-extend a n-bit number into 32 bits.
int32_t extend(uint32_t bits, size_t n)
{
  const bool top = bits & ((uint32_t) 1 << (n - 1));
  if (top)
  {
    for (size_t i = n; i < 32; ++i)
      bits |= 1 << i;
  }
  return bits;
}

如果您使用您的号码拨打上述内容:

printf("%d\n", (int) extend(0xf, 4));

打印-1