代码之家  ›  专栏  ›  技术社区  ›  Steve Hanov

我应该禁用C编译器有符号/无符号不匹配警告吗?

  •  15
  • Steve Hanov  · 技术社区  · 16 年前

    当您试图比较两个变量时,Microsoft C编译器会发出警告,其中一个有符号,另一个无符号。例如:

    int a;    
    unsigned b;
    
    if ( a < b ) { // warning C4018: '&lt;' : signed/unsigned mismatch
    
    }
    

    这个警告,在世界历史上,有没有发现过真正的错误?不管怎样,它为什么在那里?

    11 回复  |  直到 15 年前
        1
  •  24
  •   Johannes Schaub - litb    16 年前

    哦,它有。但反过来说。 忽略 有一天那个警告使我头疼。我在写一个函数,它绘制了一个图表,混合了有符号和无符号变量。在一个地方,我比较了一个负数和一个无符号数:

    int32_t t; ...
    uint32_t ut; ...
    
    if(t < ut) { 
        ...
    }
    

    猜猜怎么回事?签名号码被提升为无符号类型,因此 更大的 最后,即使最初低于0。我花了几个小时才找到那个虫子。

        2
  •  30
  •   Marko    16 年前

    不要忽略编译器警告。

        3
  •  4
  •   Jonathan Leffler    16 年前

    如果你不得不问这个问题,你不知道禁用它是否安全,所以答案是否定的。

    我不会禁用它-我不认为我总是比编译器更了解它(不仅仅是因为我经常不知道),更重要的是,我有时会因为编译器不知道而犯错误。

        4
  •  3
  •   j_random_hacker    16 年前

    应该 改变 a b 两者都使用有符号类型,或者都使用无符号类型。但这可能并不实际(例如,这可能超出你的控制范围)。

    警告是要捕获带负值的有符号整数与无符号整数之间的比较——如果两个数字的大小都很小,则前者(错误地)将被视为大于后者。

        5
  •  2
  •   z -    16 年前

    二进制运算符通常在进行比较之前将两种类型转换为相同的类型,因为其中一种类型是无符号的,所以它还将把int转换为无符号的。通常这不会造成太多的麻烦,但如果您的in t是负数,这将导致比较中的错误。

    例如,当从有符号转换为无符号时,-1等于4294967295,现在将其与100(无符号)进行比较。

        6
  •  2
  •   Jonathan Leffler    16 年前

    警告是有目的的…它们会让你仔细考虑你的代码!

    就我个人而言,如果可能的话,我总是显式地强制转换已签名的——>未签名和未签名——>已签名。通过这样做,您就可以确保获得交易的所有权,并知道将要发生什么。我意识到,这可能并不总是可能的,这取决于项目来做这件事,但总是针对0编译器警告…它只能起作用!

        7
  •  0
  •   Einstein    16 年前

    我写代码的时间比我想承认的要长。从个人经验来看,忽略看似学究的编译器警告有时会产生非常不愉快的结果。

    如果他们打扰了你,而你接受/理解了这种情况,那么就设置一个演员表,然后继续。

    最终,在设计新代码时,这些东西从一个被忽视的细微差别变成了一个有意识的决定。这样一来,Mickmouse Corner的案例就没有足够的空间破坏您或您的客户日,并且总体上质量更好的软件。

        8
  •  0
  •   EricSchaefer    16 年前

    我甚至配置了编译器使该警告成为编译错误。因为其他人都提到过的原因。

    如果我遇到有符号/无符号不匹配,我会问自己为什么选择不同的“有符号性”。通常是设计错误。

        9
  •  0
  •   Johan    16 年前

    @给我解释一下在你的链接后面找到的整条腿,这对这个问题真的很好。

    -“避免简单问题的人可能只会选择一个不那么简单的问题。”

    当您在不同类型之间转换时,如果不检查那些可能会对您造成伤害的值,则始终是这样。

    Johan

    更新:从uint转换为int的正确方法是检查 不受限制的值。h,或类似的值。 (但我很少这样做,即使是你,我知道我应该……-)

        10
  •  0
  •   mike jones    15 年前

    我认为最好把你的无符号数转换成有符号数(在比较之前)。 而不是相反。

        11
  •  -1
  •   Community CDub    8 年前

    只是其中一种 C 允许你 shoot yourself in the foot -你最好知道你在做什么。这个 C 报价归属于 Bjarne Stroustrup 创造者 C++ .