Преобразование подписанных в неподписанные и наоборот

Я должен реализовать две функции, которые преобразуют подписанные в неподписанные и наоборот. Я использую 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 ответа

Вместо того, чтобы иметь зависимость ни от одного бита, есть перегруженные функции как:

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

и так далее. Тем не менее, простой static_cast должен делать, пожалуйста, прочитайте: Как можно безопасно static_cast между unsigned int и int?

Если вы хотите, чтобы число выживало в оба конца, ваши функции не годятся.

Например: 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 это то, что вы хотите, если вы не можете обновить вопрос с более четкой спецификацией.

Другие вопросы по тегам