【问题标题】:Why is this comparison always true?为什么这种比较总是正确的?
【发布时间】:2011-04-19 16:11:27
【问题描述】:

我的文件中有以下代码:

unsigned char * pData = new unsigned char...

...

if(pData[0] >= 160 && pData[0] <= 255)

当我编译它时,我收到了来自编译器 (gcc) 的警告:

警告:由于数据类型范围有限,比较总是正确的

这怎么可能? unsigned char 的范围不是 0-255 吗?我很困惑。

【问题讨论】:

    标签: c++ warnings unsigned-char


    【解决方案1】:

    如果unsigned char 的范围是从0255 并且pData[0]char,那么pData[0] &lt;= 255 将始终是true

    【讨论】:

      【解决方案2】:

      pData[0] &lt;= 255 表达式始终为真,因为unsigned char 的范围是 0..255(在您的特定实现中)。

      它只是抱怨那一点表达式,因为pData[0] &gt;= 160 可以为真假。

      请记住,对于所有实现,unsigned char 的范围不必是 0..255(ISO C 标准不强制这样做)。

      【讨论】:

        【解决方案3】:

        比较的第二部分是多余的。它始终小于或等于 255。

        【讨论】:

        • [facepalm] 为什么我没看到?
        • 假设 CHAR_BIT 是 8 并且 char 是无符号的。
        【解决方案4】:

        您应该始终为您的表达加上括号以避免歧义,例如:

        if ((pData[0] >= 160) && (pData[0] <= 255))
        

        这能解决问题吗?

        第二个比较是多余的,所以使用:

        if (pData[0] >= 160)
        

        【讨论】:

        • 运算符优先级与此无关...关系运算符的优先级高于二元逻辑运算符。
        • 不,没有歧义。运算符优先级符合我的预期。
        【解决方案5】:

        不是无符号字符的范围 0-255?

        unsigned char 的范围是实现定义的(与其他一些帖子相比)。这是因为用于表示 char 的位数并不总是 8。只是一个 char 在您的特定实现中占用 1 个 8 位位置,因此 255 是上限。

        所以如果255有其他含义('numeric_limits&lt;char&gt;::max()'除外),我认为你还是应该继续使用检查,否则检查是多余的。

        【讨论】:

          猜你喜欢
          • 2020-07-15
          • 1970-01-01
          • 2013-02-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-08
          • 1970-01-01
          相关资源
          最近更新 更多