我如何从符号大小转换为2的补码我不知道从哪里开始任何帮助都将不胜感激。
我只能使用以下操作:!,~,|,&,^,+,>>,<

/*
 * sm2tc - Convert from sign-magnitude to two's complement
 *   where the MSB is the sign bit
 *   Example: sm2tc(0x80000005) = -5.
 *
 */
int sm2tc(int x) {

return 2;
}

最佳答案

如果数字为负数,则可以通过从0x8000000中减去该数字,将有符号大小转换为2的补码。对于机器上的32位整数,这将使用two的补码来表示负值,但如果该值为正值,则将导致two的补码为负值。一个二补负数的右移将在一个二补负数中移动,我们可以利用这个做一个掩码,在原始值之间进行选择,或者将一个有符号的量值负值转换为二补负数。

int sm2tc(int x) {
  int m = x >> 31;
  return (~m & x) | (((x & 0x80000000) - x) & m);
}

关于c - 如何从符号幅度转换为二进制补码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21837008/

10-11 15:20