【问题标题】:int to unsigned int conversionint 到 unsigned int 的转换
【发布时间】:2011-02-12 00:12:05
【问题描述】:

我很惊讶我无法通过强制转换将有符号整数转换为无符号整数!

int i = -62;
unsigned int j = (unsigned int)i;

我以为我开始使用演员表时就已经知道这一点,但我做不到!

【问题讨论】:

  • 从逻辑上讲,您希望这个演员做什么?
  • 我的坏人,但我很欣赏你的解释。我试图将signed char -62 转换为unsigned int 并期望得到194(x.x)的值
  • 嗯...选角?整数类型之间的转换不需要 C++ 中的强制转换。它们是标准转换,并且是隐式执行的。在您的情况下,您只需执行 unsigned int j = i; 即可获得完全相同的效果。
  • 您的代码编译得很好 (live on godbolt)。你能编辑这个问题,使它不暗示它不编译吗?这是误导。

标签: c++


【解决方案1】:

您可以将int 转换为unsigned int。转换有效且定义明确。

由于该值为负数,因此将UINT_MAX + 1 添加到其中,以便该值是有效的无符号数量。 (从技术上讲,2N 被添加到其中,其中 N 是用于表示无符号类型的位数。)

在这种情况下,由于您平台上的 int 的宽度为 32 位,因此从 232 中减去 62,得到 4,294,967,234。

【讨论】:

  • @SIFE:32 是上标,所以 2^32。
  • @SIFE 被转换的整数是-62...所以当你向它添加 UINT_MAX(即 2^32)时,它变成了 62 的减法。
【解决方案2】:

编辑:正如其他答案中所述,标准实际上保证“结果值是与源整数一致的最小无符号整数(模 2n,其中 n 是用于表示无符号类型的位数)”。因此,即使您的平台没有将带符号整数存储为二进制补码,其行为也是相同的。


显然,您的有符号整数 -62 在您的平台上存储在二进制补码 (Wikipedia) 中:

62 作为 32 位整数,用二进制写成

0000 0000 0000 0000 0000 0000 0011 1110

要计算二进制补码(用于存储 -62),首先将所有位取反

1111 1111 1111 1111 1111 1111 1100 0001

然后加一个

1111 1111 1111 1111 1111 1111 1100 0010

如果你把它解释为一个无符号的 32 位整数(就像你的计算机在你转换它时会做的那样),你最终会得到 4294967234 :-)

【讨论】:

    【解决方案3】:

    此转换定义明确,将产生值UINT_MAX - 61。在unsigned int 是 32 位类型的平台上(目前最常见的平台),这正是其他人报告的值。但是,其他值也是可能的。

    标准中的实际语言是

    如果目标类型是无符号的, 结果值最小 无符号整数等于 源整数(模 2^n 其中 n 是 用于表示的位数 无符号类型)。

    【讨论】:

    • 因为标准有明确的定义。为什么其他值还是可以的?
    【解决方案4】:

    i=-62 。如果要将其转换为无符号表示。对于 32 位整数,它将是 4294967234。 一个简单的方法是

    num=-62
    unsigned int n;
    n = num
    cout<<n;
    

    4294967234

    【讨论】:

      【解决方案5】:

      在数学的帮助下

      #include <math.h>
      int main(){
        int a = -1;
        unsigned int b;
        b = abs(a);
      }
      

      【讨论】:

      • @chad:C 和 C++ 之间的有符号 -> 无符号转换的规范绝对没有区别。它在两种语言中的工作方式相同。
      • 天哪,我不小心删除了我的评论。对不起!它最初说类似这样的东西是行不通的,因为二进制恭维表示的差异。我不知道我在写这篇文章时在想什么,你说的完全正确。
      【解决方案6】:

      既然我们知道iint,您可以继续取消签名它!

      这样就可以了:

      int i = -62;
      unsigned int j = unsigned(i);
      

      【讨论】:

      • 非常感谢你!
      猜你喜欢
      • 2013-09-03
      • 2014-04-05
      • 2021-01-02
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多