【问题标题】:what happens with the negative of an unsigned integer?无符号整数的负数会发生什么?
【发布时间】:2016-05-16 11:41:15
【问题描述】:

由于文字 0xffffffff 需要 32 位,它可以表示为 unsigned int 但不能表示为signed int,并且是 unsigned int 类型。但是无符号整数的负数会怎样呢?

#include <iostream>
#include <limits>

int main()
{
  int N[] = {0,0,0};

  if ( std::numeric_limits<long int>::digits==63 and
    std::numeric_limits<int>::digits==31 and
    std::numeric_limits<unsigned int>::digits==32 )
  {
    for (long int i = -0xffffffff; i ; --i)
    {
      N[i] = 1;
    }
  }
  else
  {  
    N[1]=1;
  }

  std::cout << N[0] <<N [1] << N[2];
}

输出:010

【问题讨论】:

    标签: c++


    【解决方案1】:

    根据定义,不存在负无符号整数。

    当您超出无符号整数的下限时,该值会从可能的最高值开始“环绕”。 (反之亦然)。

    当将负“有符号”值转换为无符号值时,也会触发此机制。

    因此,有符号值 -1 被转换为无符号值 $maximumUnsignedValue。同样,有符号值-$maximumSignedValue 转换为无符号值$maximumUnsignedValue - $maximumSignedValue + 1

    【讨论】:

    • 根据标准中的 §5.3.1:“无符号量的负数是通过从 2^n 中减去其值来计算的,其中 n 是提升的操作数中的位数。”那么这里 n 是 32,如果我写或者我不明白这篇文章,我们得到 2^32 - 0xffffffff = 4294967296 - 4294967295 = 1
    猜你喜欢
    • 1970-01-01
    • 2011-07-16
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 2018-02-03
    • 2017-01-29
    • 1970-01-01
    相关资源
    最近更新 更多