将负数连接到二进制数

时间:2013-02-01 19:56:06

标签: c

我正在处理一些二进制数,试图连接数字。在这种情况下,我会得到我想要的东西:

  num = 0;
  num = (num<<3)|4;
  num = (num<<9)|7;

如果格式化为4个十六进制数字,则将num设置为100000000111或0x0807。

但是,如果我尝试连接负数:

  num = 0;
  num = (num<<3)|4;
  num = (num<<9)|-7;

当我想得到0x09F9时,我得到0xFFF9。右边的9位似乎是正确的,但似乎左边的一些位正在被翻转。我猜测当我执行逻辑或带负数时,符号位被移动到最左边的位或其他东西。有什么方法可以防止这种情况吗?

另外,我知道在我的例子中我可以将num设置为没有移位的数字,但在我的实际程序中这些是变量,我只是硬编码数字来演示。

1 个答案:

答案 0 :(得分:3)

-7可能是一个32位负数 - 即0xfffffff9。如果您只想使用9位,则需要屏蔽它:

num = (num << 9) | (-7 & 0x1ff)