我如何在字符尺寸扩大二进制符号数到signed int的大小
此功能:int signextend(int value, int size)
在符号二进制接收数值(最显著位说信号+
如果是0或-
如果是1),它接收这个二进制值的大小。 目标是将该值扩展为已签名的int大小。我该怎么做呢?我如何在字符尺寸扩大二进制符号数到signed int的大小
我知道我需要2,如果是一个,如果最显著位为1或0将其与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;
}
这使得争论unsigned
,因为有他们签字是没有意义的我。
如果这样调用:signextend(0xc, 4);
它将返回-4(0xc
是1100
二进制)。
注意,此格式可表达-0
(考虑例如signextend(0x80, 8);
)这当然是不能表示为一个int
和将被映射到0。
感谢您的帮助,我会尝试一下^^ –
如果最重要的位是1,那么数字应该用1来扩展,它必须被签名。如果它是0,则数字应该用0延长。它已签字,并且延期的区别是 –
大小这个二进制值的
如果这意味着这是二进制字符串的长度(例如,由1010
表示的int 10将给出大小= 4),那么就这样做
int b = 8;
int size = 4;
printf("this is the most significant bit %d", b >> size-1);
非常感谢。这是我需要的东西 –
'size'是以字节还是以位为单位指定源数据的大小?这里有多个符号扩展问题,这个问题可能是重复的。 – njuffa
@njuffa大小指定的值的位数,例如我收到1011大小= 4,我想选择位于左侧的位,在这种情况下为1.并扩展它(int size = 32-size( 4(在这种情况下)))左边 所以它就像11111 .... 111111011 –
长度为4的二进制串1011是否表示小数-5(2的补码表示),-4(1的补码表示),或-3(符号和幅度表示)? –