【发布时间】:2014-09-25 10:39:10
【问题描述】:
我必须实现两个将有符号转换为无符号的函数,反之亦然。我正在使用 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;
}
}
编辑:
我需要指定位,因为这将与硬件一起使用。因此,我可能需要将返回类型中的值限制为 18 位或 4 等...
【问题讨论】:
-
这里的第二个参数位有什么用?
-
“这些正确吗?”是的,对于“正确”的某些特殊值。您需要定义在目标类型无法表示值的情况下转换应该做什么,然后根据您的定义检查您的实现。
-
@@user1876942 如果无符号值大于 INT_MAX,你将如何将无符号值转换为有符号值?
-
@user1876942:不是真的,因为我不知道你的
unsignedToSigned()函数应该做什么。 (它做什么根本没有意义。)所以:简单的static_cast<int>()有什么问题unsignedToSigned()应该修复? -
@user1876942:我不知道它是否会“工作”因为您不清楚您的要求是什么,并且您当前的实施存在错误。