我在64位计算机上遇到C ++程序错误。错误如下。为了完全理解错误,我尝试了一些程序变体来查看错误/警告何时没有出现。随着变化,我希望更好地理解它。
程序用
编译gcc -Wall -Werror -Wextra
错误:有符号和无符号整数表达式之间的比较
这个程序给我错误。这是我看到的模式。
#include <cstdio>
#include "stdint.h"
int main()
{
uint16_t len =10;
uint8_t number =5;
uint8_t number2 =10;
uint8_t * ptr =&number;
uint8_t * ptr2 =&number2;
if(len - sizeof(uint32_t) < ptr -ptr2)
{
printf("done\n");
}
return 0;
}
此代码编译文件但没有上述错误。 我从中看到的模式是
#include <cstdio>
#include "stdint.h"
int main()
{
uint32_t len =1;
uint32_t len2 =3;
uint32_t number =5;
uint32_t number2 =10;
uint32_t * ptr =&number;
uint32_t * ptr2 =&number2;
if(len - len2 < ptr -ptr2)
{
printf("Worked\n");
}
}
这个程序编译好,没有上面的错误。 我在这里看到的模式
#include <cstdio>
#include "stdint.h"
int main()
{
uint16_t len =2;
uint16_t len2 =5;
uint8_t number =5;
uint8_t number2 =10;
uint8_t * ptr =&number;
uint8_t * ptr2 =&number2;
if(len - len2 < ptr -ptr2)
{
printf("done\n");
}
}
问题
感谢您的帮助
答案 0 :(得分:3)
我认为是时候有人把我们在评论中学到的东西放到答案中了,所以就这样了。
在此实现中,size_t
是无符号的64位整数,ptrdiff_t
是带符号的64位整数。
在第一次比较中,if(len - sizeof(uint32_t) < ptr -ptr2)
,len
被提升为64位,但仍然是无符号的,以匹配sizeof
,但指针算术的结果是有符号的( ptrdiff_t
)。因此,它将无符号值与有符号值进行比较。
在其他情况下(if(len - len2 < ptr -ptr2)
),len
和len2
总是小于64位,因此始终可以提升结果或减法以匹配64位{ {1}}。由于我们正在添加位,因此结果的“signed-ness”无关紧要(无符号32位可以在64位中舒适地坐着,无论它是否有符号),因此可以选择匹配另一侧比较。因此,不会发出错误或警告。