4

我已经使用 libnet 一段时间了,我注意到有一些函数的返回值是uint32_t,据我了解,它是无符号类型。但是,在文档中,它说如果发生错误(这是有符号类型)返回 -1 libnet_get_ipaddr4libnet_get_prand例如,请参见。

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

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

我想比较发生在 -1 解释为 unsigned int 与返回值之间,返回值取相同的值;比较是真的。

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

4

1 回答 1

4

引用 C99 标准草案,6.2.5.9:

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

所以 -1 会自动转换为UINT32_MAX.

警告:处理超出范围的值对于有符号类型来说不是很好。有关各种并发症,请参见此处此处

6.5.9 说对于相等运算符,

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

6.3.1.8 描述了这些转换:

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

(您可以通过标准寻找类似的理由来为返回有符号类型的函数返回 -1,但它基本上是相同的参数,所以我不会打扰。)

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

于 2018-12-29T10:59:27.113 回答