将签名转换为无符号,反之亦然

时间:2014-09-25 10:39:11

标签: c++ linux unsigned

我必须实现两个将signed转换为unsigned的函数,反之亦然。我正在使用c ++ 11和Linux。

系统是两个补码,可以取char,int,long等。接口必须如所述,我试图实现一些东西。有没有更好的方法来做到这一点?这些是正确的吗?如何根据位数更改实现?我需要一些建议。

uint32_t signedToUnsigned(int32_t x, uint8_t bits)
{
    return ( x > 0 ? x:-x);
}

int32_t unsignedToSigned(uint32_t x, uint8_t bits)
{
    if(x <= INT_MAX )
        return static_cast<int>(x);

    if(x >= INT_MIN)
        return static_cast<int>(x - INT_MIN)+ INT_MIN;
    else
    {
        printf("ERROR");
        return x;
    }
}

编辑:

我需要指定位,因为它将与HW一起使用。所以,我可能需要将返回类型的值限制为18位或4等...

2 个答案:

答案 0 :(得分:1)

而不是具有no的依赖性而不是重载函数:

uint32_t signedToUnsigned(int32_t x);
uint64_t signedToUnsigned(int64_t x);
uint16_t signedToUnsigned(int16_t x);

等等。 但是,简单的static_cast应该这样做,请阅读:How does one safely static_cast between unsigned int and int?

答案 1 :(得分:1)

如果你希望一个号码能够在往返中存活,那么你的功能就不好了。

例如:std::cout << unsignedToSigned( signedToUnsigned( -13, 0 ), 0 ); // prints 13 NOT -13

static_cast将在往返过程中幸存下来:std::cout << static_cast< int32_t >( static_cast< uint32_t >( -13 ) ); // prints -13

所以我认为static_cast是你想要的,除非你能用更清晰的规范更新问题。