使用按位运算符在 C 中返回最负的二进制补码数

Returning the Most Negative Two's Complement Number in C with Bitwise Operators

我在 C 中有一个函数应该 return 最负的二进制补码:

int mostNegTwosComp(void) {

    return 0;
}

我只能使用最多 4 个按位运算符。这些运算符包括:! ~ & ^ | + << >>。我该怎么做呢?最负的二进制数是否取决于所选数字的位数?例如,10000 将是 16 位整数的最负二进制数?

return ~ (~0u >> 1);

~ 打开 unsigned 零中的所有位。然后 >> 1 右移,导致高位变为零。然后 ~ 反转所有位,在高位生成 1,在其余位生成 0。

然后 return 将其转换为 int。这具有实现定义的行为,但 class 这种分配通常假定适合练习的行为。

如果您不需要便携式版本,您可以滥用整数几乎总是 4 个字节的知识。

return 0x80000000;

事实上,如果您知道要输入的类型的大小 return,您可以跳过按位游戏并使用以下格式作弊:

  1. 在0x__中,每个数都是4 bits.This表示2位为一个字节
  2. 您希望第一位为 1,所有其他位为 0。
  3. 0x8 = 0b1000
  4. 因此,您可以将第一个字节之后的类型的每个字节的值表示为 0x80 + 2 个“0”。

但要回答你剩下的问题。

How would I go about doing this?

如果您正在制作模板,您(可能)会使用其他答案建议的按位技巧。否则你可以使用上面的代码作弊或者使用 limits.h (iirc) 中的定义。

~ (~0u >> 1);

将是一个便携的解决方案。

Wouldn't the most negative two's comp number be dependent on how many bits the selected number is?

最负二的补码取决于包含变量的大小,所以我想你可以说 "selected number"。事实上,值的范围取决于包含变量的大小。

For instance, 10000 would be the most negative two's comp number of a 16 bit int?

对于 16 位,最负的二进制数将是 0x80000b1000000000000000-32768,具体取决于您希望如何表示。