【问题标题】:How to avoid warning message of "'=': truncation of constant value"?如何避免“'=': truncation of constant value”的警告信息?
【发布时间】:2018-03-21 02:36:25
【问题描述】:

我这里有一个位向量,主要是为了学术价值。它对 8、16、32、64 等很灵活。在这种情况下,底层数组是一个 32 位指针。每个单元包含 32 位,可以单独设置和清除。

Bitvector<unsigned long int> b(32);  

我将每个 32 位单元格的所有位都填充为 1。

bool setAll()
{
    for (int i = 0; i < m_size; i++)
    { 
        if (m_intSize == 32)
            m_array[i] = 0xFFFFFFFF;
        else if (m_intSize == 64)
            m_array[i] = 0xFFFFFFFFFFFFFFFF;
        else if (m_intSize == 16)
            m_array[i] = 0xFFFF;
        else if (m_intSize == 8)
            m_array[i] = 0xFF;
        else 
            return false; 
    }

    return true;
}

任何人都可以猜到,一个 32 位的动态数组指针不能指向 64 位,所以我在 m_array[i] = 0xFFFFFFFFFFFFFFFF; 上得到这个截断错误;

warning C4309: '=': truncation of constant value

有没有办法摆脱这个警告?有没有一些你可以做的选项,比如 -1 * sizeof(T) 或类似的?

【问题讨论】:

    标签: c++


    【解决方案1】:

    是的,假设一个无符号值,执行此操作的正常方法是:

    void setAll()
    {
       for (int i = 0; i < m_size; i++)
           m_array[i] = -1;
    }
    

    C++ 中的无符号整数被定义为环绕,因此无论m_array[i] 在该平台上,这始终为您提供最大可能值。

    您也可以使用#include &lt;limits&gt; 并使用std::numeric_limits&lt;T&gt;::max(),但这并不那么酷。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-25
      • 2021-02-04
      • 2019-02-21
      • 1970-01-01
      • 2014-03-21
      相关资源
      最近更新 更多