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