C 如何区分负二进制数?

C 如何区分负二进制数?,c,binary,C,Binary,假设我正在处理4位操作。所以如果我遇到一个二进制数字 1111 那我该怎么推断呢?是-1还是15?“这取决于” 位(在本例中)编码一个数字,但您必须知道哪种类型的数字(有符号或无符号、整数、定点或浮点)才能解释编码位 如果这个数字应该是2的补码,那么正确的解释是-1,如果它是无符号的,那么它是15 仅仅从这四个位元是不可能决定的,这根本就不够信息 当然,对于“全尺寸”值也是如此,它可以是int或无符号int,为了正确解释位,您必须知道这一点 更新:如果你知道你的数字应该是有符号的,最简单的处理

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

1111
那我该怎么推断呢?是-1还是15?

“这取决于”

位(在本例中)编码一个数字,但您必须知道哪种类型的数字(有符号或无符号、整数、定点或浮点)才能解释编码位

如果这个数字应该是2的补码,那么正确的解释是-1,如果它是无符号的,那么它是15

仅仅从这四个位元是不可能决定的,这根本就不够信息

当然,对于“全尺寸”值也是如此,它可以是
int
无符号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;
}

它打印
-1

它取决于格式,但如果它是2s补码,则它是-1。(如果是1的补码,则为-0,如果是符号+幅值,则为-7,如果是偏移二进制,则为+7)。这取决于上下文。即使是强大的CPU也不知道它的符号:你会使用适当的指令。因为你的问题是关于C的,你不仅仅有一个二进制数字序列。您可能在某个特定类型的对象中存储了一个值。(这个对象大于4位,除非它是一个位域。)如果你能准确地解释这4位是以什么形式存在的,这个问题很可能会自己回答。事实上,在你的问题中没有提到C。你能更新你的问题来告诉我们你正在使用的C代码吗?@PaulR如果它是未签名的,它是+15。而且…如果它是奇怪的编码,它可以是任何东西@Jean BaptisteYunès:是的,但我认为OP谈论的是有符号值(见标题)。@Ryker不,数字宽度不重要,如果你说“我处理的是2位数字,什么是
11
?”或“我处理的是16位数字,什么是
1111111
?”同样困难。我不明白你的第二个引文。
printf("%d\n", (int) extend(0xf, 4));