2017-04-19 18 views
0

此功能:int signextend(int value, int size) 在符号二进制接收数值(最显著位说信号+如果是0或-如果是1),它接收这个二进制值的大小。 目标是将该值扩展为已签名的int大小。我该怎么做呢?我如何在字符尺寸扩大二进制符号数到signed int的大小

我知道我需要2,如果是一个,如果最显著位为1或0将其与1或0延伸,但是我不知道如何从价值选择最显著位

+0

'size'是以字节还是以位为单位指定源数据的大小?这里有多个符号扩展问题,这个问题可能是重复的。 – njuffa

+0

@njuffa大小指定的值的位数,例如我收到1011大小= 4,我想选择位于左侧的位,在这种情况下为1.并扩展它(int size = 32-size( 4(在这种情况下)))左边 所以它就像11111 .... 111111011 –

+0

长度为4的二进制串1011是否表示小数-5(2的补码表示),-4(1的补码表示),或-3(符号和幅度表示)? –

回答

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(0xc1100二进制)。

注意,此格式可表达-0(考虑例如signextend(0x80, 8);)这当然是不能表示为一个int和将被映射到0。

+0

感谢您的帮助,我会尝试一下^^ –

+0

如果最重要的位是1,那么数字应该用1来扩展,它必须被签名。如果它是0,则数字应该用0延长。它已签字,并且延期的区别是 –

0

大小这个二进制值的

如果这意味着这是二进制字符串的长度(例如,由1010表示的int 10将给出大小= 4),那么就这样做

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

非常感谢。这是我需要的东西 –

相关问题