该函数: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/