收到备注作为有符号和无符号操作数之间的比较

时间:2017-07-27 09:00:52

标签: c

我有一个" C"代码片段如下

int32_t A = 5;
uint32_t B = 8;
if ( A >= B )
 {
   printf("Test");
 }

当我构建这个时,我收到了一条评论/警告"有符号和无符号操作数之间的比较。可以解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

一切正常,A为正,且B小于2^31

但是,如果A小于0,则会发生意外行为。

A = -1,在内存中它将保存为0xFFFFFFFFB = 5,在内存中,它将保存为0x00000005

当你这样做时

if (A < B) {
    //Something, you are expecting to be here
}

编译器会将它们作为无符号32位整数进行比较,并将if扩展为:

if (0xFFFFFFFF < 0x00000005) {
    //Do something, it will fail.
}

编译器警告您这个可能的问题。

Comparison operation on unsigned and signed integers

答案 1 :(得分:0)

好,非常好!您正在阅读并注意编译器警告。

在您的代码中:

int32_t A = 5;
uint32_t B = 8;

if ( A >= B )
{
   printf("Test");
}

您有'A'作为已签名的 int32_t值,其最小值/最大值为-2147483648/2147483647且您已未签名 {最小/最大为uint32_t的{​​1}}。编译器会根据所涉及的类型生成警告,以防止始终为true或false的情况。对于来自0/4294967295的{​​{1}}的允许范围内的任何值,A B永远不会大于B。无论涉及的个人价值如何,整个数字都将提供2147483648 - 4294967295

另一个很好的例子是False,它会为if ( A < B )中的TRUE的所有值生成A,因为 unsigned 类型永远不会小于零。

编译器警告是警告,使用这些类型进行测试可能无法为某些数字范围提供有效的比较 - 您可能没有预料到。

在现实世界中,如果您知道-2147483648 - -1只保留A中的值,那么您可以简单地告诉编译器1)您理解警告并由您的演员表明2)保证值将提供有效的测试,例如

0 - 900

如果您无法保证 1)&amp; 2),然后是时候以一种你没有面对警告的方式重写代码。

这里发生了两件好事。您已启用编译器警告,并且您花时间阅读并了解编译器告诉您的内容。这会一次又一次地出现。现在您知道如何确定可以/应该做什么。