签名/无符号不匹配

时间:2015-06-24 14:00:36

标签: c compiler-warnings

我很难理解我在代码中遇到的问题的性质。 行

if ((struct.c == 0x02) && (struct2.c == 0x02) && (struct.s == !struct2.s))
    {/**/}

其中cintsuint64_t生成

  

C4388:'=='签名/未签名不匹配

警告。我明白那个警告是什么,我看不到这里触发的是什么。我错过了什么?

2 个答案:

答案 0 :(得分:12)

直接引用C11标准,章节§6.5.3.3,(强调我的

  

如果操作数的值比较,则逻辑否定运算符!的结果为0   如果其操作数的值等于0,则不等于10结果的类型为int ....

因此,逻辑!运算符的结果为int,因此!struct2.s生成int值,表达式

....(struct.s == !struct2.s)

会产生问题。

注1:

我猜您使用struct作为结构名称仅用于说明目的,否则structC中的保留关键字,您不能将其用作变量名。

注2:

也许你的意思是(struct.s != struct2.s),但这也只是一个(可能的)猜测。

FOOTNOTE ::早期的问题也标记为C ++,将其作为脚注移动,但保留信息仅供参考。
关于C++!的返回类型为bool。参考:C++11,章节§5.3.3(再次强调我的)

  

逻辑否定运算符!的操作数在上下文中转换为bool (Clause 4); its value is true if the converted operand is false and false结果的类型为bool

答案 1 :(得分:1)

[评论太久了]

为了充分利用编译器警告,请始终尝试在一行中只放置一个语句/表达式(至少在尝试确定错误/警告的来源时是暂时的)。

所以,如果您已经以这种方式设置代码:

if (
    (struct.c == 0x02) 
    && (struct2.c == 0x02) 
    && (struct.s == !struct2.s)
  )

编译器完全指出(相对地)第4行。