【问题标题】:Converting Signed to Unsigned and vice versa将有符号转换为无符号,反之亦然
【发布时间】: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&lt;int&gt;() 有什么问题unsignedToSigned() 应该修复?
  • @user1876942:我不知道它是否会“工作”因为您不清楚您的要求是什么,并且您当前的实施存在错误。

标签: c++ linux unsigned


【解决方案1】:

而不是依赖于没有位的重载函数为:

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?

【讨论】:

  • 我会检查那个 static_cast。换个方式,signedToUnsigned 怎么样?
  • 同样你可以去signedToUnsigned
  • @user1876942:您的 signedToUnsigned() 在标准库 () 中实现为 std::abs()(用于“绝对值”)。
  • @user1876942 我怀疑您正在使用cmath 中包含的C abs 函数。在文件的顶部,您应该#include &lt;complex&gt;,这将为您提供std::abs 的模板化C++ 版本并返回32767
  • @user1876942 听起来你真正想要的是 (std::bitset)[cplusplus.com/reference/bitset/bitset/].您可以在此处查看运算符:cplusplus.com/reference/bitset/bitset/operators。听起来你想特别关注operator~
【解决方案2】:

如果你想让一个数字在往返过程中存活下来,你的功能就不好了。

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

static_cast 将在往返中幸存:std::cout &lt;&lt; static_cast&lt; int32_t &gt;( static_cast&lt; uint32_t &gt;( -13 ) ); // prints -13

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

【讨论】:

    猜你喜欢
    • 2011-11-08
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 2021-03-15
    • 2011-08-09
    • 1970-01-01
    • 2014-09-21
    • 2018-05-22
    相关资源
    最近更新 更多