如何区分负二进制数?

3

假设我正在处理4位操作。因此,如果我遇到一个二进制数字,比如

1111

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

3
这取决于数据格式,如果是二进制补码,则结果为-1。(如果是一进制补码,则为-0;如果是符号加绝对值,则为-7;如果是偏移二进制,则为+7)。 - Paul R
它取决于上下文。即使是强大的CPU也不知道它的符号:您需要使用适当的指令。 - Weather Vane
1
由于您的问题涉及C语言,因此您不仅仅拥有一系列二进制数字。您可能在某个特定类型的对象中存储了一个。(除非它是位域,否则该对象的大小大于4位。)如果您能够准确地解释您拥有这4位的形式,那么问题很可能会得到解答。目前为止,在您的问题中没有提到任何关于C语言的信息。您能否更新您的问题,向我们展示您正在使用的C代码? - Keith Thompson
@Jean-BaptisteYunès:没错,但我认为OP在谈论有符号的值(见标题)。 - Paul R
这里有一个关于浮点数存储位解释的讨论,可能会对你准确回答问题时需要考虑的一些依赖关系有所启示。链接在此:https://dev59.com/p2w05IYBdhLWcg3w_Gqw#6911412 - ryyker
显示剩余3条评论
1个回答

2
"那要看情况。"
这里的比特位(bits)编码了一个数字,但是你必须知道这个数字的类型(带符号或无符号、整数、定点数还是浮点数),才能解释编码后的比特位。
如果这个数字在二进制补码中应被视为带符号,那么正确的解释就是-1;如果它是无符号的,那么解释就是15。
仅凭这四个比特位是不可能确定它的类型的,信息太少了。当然,对于一个“完整大小”的值来说也是一样,它可以是int或unsigned 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


@ryyker 不,数字的宽度并不重要,无论你说“我正在处理2位数字,11是多少?”还是“我正在处理16位数字,1111111111111111是多少?”,难度都是一样的。我不理解你的第二个引用文本。 - unwind

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接