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

标签 c bit extend signed

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

我知道如果最高有效位是 1 或 0,我需要 2 个 if 来用 1 或 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;
}

这使得参数无符号,因为让它们签名对我来说没有意义。

如果像这样调用:signextend(0xc, 4);它将返回-4(0xc在二进制中是1100)。

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

关于c - 如何将 char 大小的二进制有符号数扩展为有符号 int 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43492779/

相关文章:

c - 如何使用 SWIG 在 C 中构建 Perl 哈希?

reverse - Java 的 BigInteger 符号大小如何工作

Android Kotlin - 如何扩展 ConstraintLayout?

javascript - Angularjs 扩展服务和继承

python - 为什么要扩展 python 列表

c - 如何创建一个改变字符串的函数?

c - libuv 读取回调 uv_buf_t 清理

c - 是否可以在此代码中使用重复结构?

c - 如何将 4 个 uint32_t int 组合成一个完整的 128 位 int 并返回

c - 从 C 中的 unsigned int 末尾获取 'n' 二进制位?位掩码?