我必须实现将signed转换为unsigned的两个函数,反之亦然。 我正在使用C ++ 11和Linux。
该系统是二进制补码,可以采取字符,整数,长等。接口必须如所述,我试图实现的东西。 有没有更好的方法来做到这一点? 这些是正确的吗? 我怎样才能改变基于位数的实现? 我需要一些build议。
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; } }
编辑:
我需要指定位,因为这将用于硬件。 所以,我可能需要将返回types的值限制为18位或4位等等。
而不是具有重载函数的重载函数如下:
uint32_t signedToUnsigned(int32_t x); uint64_t signedToUnsigned(int64_t x); uint16_t signedToUnsigned(int16_t x);
等等。 但是,简单的static_cast应该这样做,请阅读: 如何安全unsigned int和int之间的static_cast?
如果你想要一个数字来回生存,你的功能就不好。
例如: std::cout << unsignedToSigned( signedToUnsigned( -13, 0 ), 0 ); // prints 13 NOT -13
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
std::cout << static_cast< int32_t >( static_cast< uint32_t >( -13 ) ); // prints -13
所以我认为static_cast
是你想要的,除非你能用更清晰的规范来更新这个问题。