【问题标题】:How do i expand a binary signed number in char size to signed int size如何将 char 大小的二进制有符号数扩展为有符号 int 大小
【发布时间】:2017-04-19 10:15:59
【问题描述】:

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

如果最高有效位是 1 或 0,我知道我需要 2 if's one 以用 1 或 0 扩展它,但我不知道如何从值中选择最高有效位

【问题讨论】:

  • size 是否以字节或位指定源数据的大小?以前这里有多个符号扩展问题,这个问题可能是重复的。
  • @njuffa size 指定值的位数,例如我收到 1011 所以 size = 4,我想选择左侧的位,在本例中为 1。并扩展它( int size = 32-size (在这种情况下为 4) 次向左所以它就像 11111....111111011
  • 长度为4的二进制字符串1011是表示十进制数-5(2的补码表示)、-4(1的补码表示)还是-3(符号和大小表示)?

标签: c bit extend signed


【解决方案1】:

这样的事情应该可以工作。顺便说一下,这些数字称为符号大小:

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(0xc 是二进制的 1100)。

请注意,这种格式可以表示-0(考虑例如signextend(0x80, 8);),当然它不能表示为int,并且将被映射为0。

【讨论】:

  • 感谢您的帮助,我会试试看^^
  • 如果最高有效位为 1,则必须签名,该数字应以 1 扩展。如果为 0,则该数字应以 0 扩展。它已签名并且扩展名的差异存在
【解决方案2】:

这个二进制值的大小

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

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

【讨论】:

  • 非常感谢。这就是我需要的东西
猜你喜欢
  • 2014-12-04
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
  • 2011-06-18
  • 2013-10-04
  • 2020-04-03
  • 2016-08-19
相关资源
最近更新 更多