我有一个" C"代码片段如下
int32_t A = 5;
uint32_t B = 8;
if ( A >= B )
{
printf("Test");
}
当我构建这个时,我收到了一条评论/警告"有符号和无符号操作数之间的比较。可以解决这个问题吗?
答案 0 :(得分:0)
一切正常,A
为正,且B
小于2^31
。
但是,如果A
小于0
,则会发生意外行为。
A = -1
,在内存中它将保存为0xFFFFFFFF
。
B = 5
,在内存中,它将保存为0x00000005
。
当你这样做时
if (A < B) {
//Something, you are expecting to be here
}
编译器会将它们作为无符号32位整数进行比较,并将if扩展为:
if (0xFFFFFFFF < 0x00000005) {
//Do something, it will fail.
}
编译器警告您这个可能的问题。
答案 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),然后是时候以一种你没有面对警告的方式重写代码。
这里发生了两件好事。您已启用编译器警告,并且您花时间阅读并了解编译器告诉您的内容。这会一次又一次地出现。现在您知道如何确定可以/应该做什么。