如何将char大小的二进制有符号数扩展为signed int大小

时间:2017-04-19 10:16:00

标签: c bit extend signed

此功能:int signextend( int value, int size ) 接收带符号二进制的值(如果为0,则最高有效位表示信号+或如果为1则表示-)并且它接收该二进制值的大小。 目标是将值扩展为已签名的int大小。我该怎么做?

我知道如果最高有效位为1或0,我需要2如果为1,则用1​​或0来扩展它,但我不知道如何从值中选择最高有效位

2 个答案:

答案 0 :(得分:0)

这样的事情应该有效。顺便说一下,这些数字称为符号幅度:

int signextend(unsigned int value, unsigned int size)
{
  const unsigned int topmask = 1u << (size - 1);
  if((value & topmask) != 0)
  {
    return -(value & ~topmask);
  }
  return (int) value;
}

这使得参数unsigned自签名以来对我毫无意义。

如果这样调用:signextend(0xc, 4);它会返回-4(0xc1100二进制)。

请注意,此格式可以表达-0(例如signextend(0x80, 8);),这当然不能代表int,并且会映射到0。

答案 1 :(得分:0)

  

此二进制值的大小

如果你这意味着这是二进制字符串的长度(例如由1010表示的int 10,将给出size = 4)那么就这样做

int b = 8;
int size = 4;
printf("this is the most significant bit %d", b >> size-1);