【问题标题】:Assigning max value of smaller integer to a larger integer将较小整数的最大值分配给较大的整数
【发布时间】:2010-11-01 22:27:46
【问题描述】:

考虑以下代码:

 uint32_t x = ~uint8_t(0);
 std::cout << x << std::endl;

现在,我完全期望它输出 255,但它却输出 4294967295

我知道 C++ 中的整数提升,但我不明白为什么会发生这种情况。按照我的理解,表达式~uint8_t(0) 应该以二进制形式计算为1111 1111。然后~ 运算符将通过符号将值扩展为0000 0000 0000 0000 0000 0000 1111 1111,将类型提升为int(为了讨论,我假设它是32 位)。然后应该将此提升的值分配给左值x,从而得到x == 255

但显然我没有正确理解这一点。我错过了什么?

【问题讨论】:

    标签: c++ integer ones-complement


    【解决方案1】:

    对一元~ 的操作数执行整数提升,因此uint8_t(0) 提升为int,然后评估~。相当于

    ~(int)(uint8_t)0
    

    您可以使用std::numeric_limits&lt;T&gt;::max() 获得一个类型可表示的最大值;如果类型是无符号的,您也可以将-1 转换为该类型:

    uint32_t x = (uint8_t)-1;
    

    【讨论】:

    • 不是提升为int,而不是unsigned int吗?
    • @Channel72:是的;我的错。谢谢。
    • @Channel,你是对的,因为 §4.5(积分促销)“除 bool、char16_t、char32_t 或 wchar_t 之外的整数类型的右值,其整数转换等级 (4.13) 小于如果 int 可以表示源类型的所有值,则 int 的秩可以转换为 int 类型的右值;否则,可以将源右值转换为 unsigned int 类型的右值。一个 int 显然可以保存任何字节。
    • @Matthew Flaschen:这听起来像 C99,而不是 C++03。
    • @MSalters,不,它来自2008 C++ working draftcstdint,在问答中都使用,在 C++03 中不可用(计划为 C++0x)。到目前为止,固定字符仅在 C++ 草案中(不是任何 C)。
    【解决方案2】:

    在您的示例中,按位非运算符 (~) 在执行之前将其操作数提升为 int。然后通过分配将其转换为unsigned int

    以下是一些相关的代码示例,可以更清楚地说明这一点:

    uint8_t y = ~uint8_t(0);
    uint32_t x = y;
    std::cout << x << std::endl;
    

    255

    uint8_t y = uint8_t(0);
    int z = ~y;
    uint32_t x = z;
    std::cout << x << std::endl;
    

    4294967295

    【讨论】:

      猜你喜欢
      • 2016-09-14
      • 1970-01-01
      • 2019-03-25
      • 2020-09-08
      • 1970-01-01
      • 2012-01-19
      • 2014-11-07
      • 2016-03-31
      • 1970-01-01
      相关资源
      最近更新 更多