函数返回类型是无符号的,而返回-1则表示错误

时间:2018-12-29 10:34:52

标签: c libnet signedness

我使用libnet已有一段时间了,我注意到有些函数的返回值为uint32_t,据我所知,这是一个无符号类型。但是,在documentation中,它表示如果发生错误(这是带符号的类型),则返回-1。例如,请参见libnet_get_ipaddr4libnet_get_prand

但是,我可以毫无问题地使用这些功能:

if ((src_ip_addr = libnet_get_ipaddr4(l)) == -1) { /* treat the failure*/ }

我假设将-1(解释为unsigned int)与采用相同值的返回值进行比较;比较是真的。

尽管这显然可行,但我的问题是:这有意义吗?为什么??作为程序员,我应该如何检查返回值以了解是否发生了错误?上面显示的代码段是否正确?

1 个答案:

答案 0 :(得分:3)

引用C99标准草案6.2.5.9:

  

涉及无符号操作数的计算永远不会溢出,   因为无法用结果无符号整数类型表示的结果是   减少模数,该数比可以是的最大值大1   由结果类型表示。

因此-1自动转换为UINT32_MAX

警告:对于 signed 类型,处理超出范围的值并不理想。有关各种并发症,请参见herehere

6.5.9说,对于相等运算符,

  

如果两个操作数都具有算术类型,则通常的算术转换为   执行。

6.3.1.8描述了以下转换:

  

[...]   否则,如果具有无符号整数类型的操作数的秩更大或   等于另一个操作数类型的等级,然后是   有符号整数类型将转换为无符号操作数的类型   整数类型。   [...]

(您可以在标准中寻找类似的理由,以便为返回带符号类型的函数返回-1,但这基本上是相同的参数,因此我不会打扰。)

换句话说,是的,这是完全正确的。