如何让C中的strtol()函数将字符串解释为二进制补码?

时间:2019-11-04 06:15:34

标签: c strtol

我想将给定的字符串转换为整数。但是,我意识到,strtol()会将诸如“ 0xffc”之类的值解释为具有值4092,而不是将其解释为2的补码(应为-4)。我不能修改该字符串,因为它是命令行参数。那么,如何获得将给定字符串解释为2的补数的整数值呢?

2 个答案:

答案 0 :(得分:1)

当将其视为12位整数(补码2s)时,值0xffc将变为-4。否则(int,short,...)仅为4092。

考虑

http://[::1]/project/form/create

或任意N位:

int v= strtol(v) ;
if ( v & 1<<11 ) v |= ~0xfff ;

答案 1 :(得分:0)

您似乎期望使用12位2s补码值。
在此阈值即最高正值是2047(0x8ff)。 要达到-2048 ... 2047的值范围(通常的“准对称” 12位表示的范围),只需对接收到该值的变量执行此操作。

if(iValue>2047) /* note that in the wide range of the receiving variable, this makes sense */
{
    iValue-=4096; /* in the 16bit (or more) representation, this makes sense */
}

当然,此代码假定读取的值在0 .... 4095之内,并且接收变量的宽度大于12位,但是您似乎应该这样做。 似乎很想进行16位的位操作,但是它们将需要对包含变量的位宽进行假设。仅减去适当的值,仅假设表示的较小值范围,而不假设变量的内部表示。