我使用libnet已有一段时间了,我注意到有些函数的返回值为uint32_t
,据我所知,这是一个无符号类型。但是,在documentation中,它表示如果发生错误(这是带符号的类型),则返回-1。例如,请参见libnet_get_ipaddr4
,libnet_get_prand
。
但是,我可以毫无问题地使用这些功能:
if ((src_ip_addr = libnet_get_ipaddr4(l)) == -1) {
/* treat the failure*/
}
我假设将-1(解释为unsigned int)与采用相同值的返回值进行比较;比较是真的。
尽管这显然可行,但我的问题是:这有意义吗?为什么??作为程序员,我应该如何检查返回值以了解是否发生了错误?上面显示的代码段是否正确?
答案 0 :(得分:3)
引用C99标准草案6.2.5.9:
涉及无符号操作数的计算永远不会溢出, 因为无法用结果无符号整数类型表示的结果是 减少模数,该数比可以是的最大值大1 由结果类型表示。
因此-1自动转换为UINT32_MAX
。
警告:对于 signed 类型,处理超出范围的值并不理想。有关各种并发症,请参见here和here。
6.5.9说,对于相等运算符,
如果两个操作数都具有算术类型,则通常的算术转换为 执行。
6.3.1.8描述了以下转换:
[...] 否则,如果具有无符号整数类型的操作数的秩更大或 等于另一个操作数类型的等级,然后是 有符号整数类型将转换为无符号操作数的类型 整数类型。 [...]
(您可以在标准中寻找类似的理由,以便为返回带符号类型的函数返回-1,但这基本上是相同的参数,因此我不会打扰。)
换句话说,是的,这是完全正确的。