此功能:int signextend( int value, int size )
接收带符号二进制的值(如果为0,则最高有效位表示信号+
或如果为1则表示-
)并且它接收该二进制值的大小。
目标是将值扩展为已签名的int大小。我该怎么做?
我知道如果最高有效位为1或0,我需要2如果为1,则用1或0来扩展它,但我不知道如何从值中选择最高有效位
答案 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(0xc
为1100
二进制)。
请注意,此格式可以表达-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);