使用-1作为unsigned(size_t)类型的标志值

dsp*_*pyz 9 c c++ d twos-complement

我使用-1作为返回类型为size_t(无符号类型)的函数的标志值.

我一开始并没有注意到它,特别是因为它没有导致我的代码中的任何错误(我用x == -1,而不是x <0来检查它).

是否有任何微妙的原因我不应该留下它?什么时候这可能出乎意料?这是常用的吗?

ptrdiff_t不太常见,输入时间较长,而且无论如何它都不是合适的类型,因为函数会将索引返回到数组中.

Sha*_*our 13

-1将始终转换为最大无符号值,这是由于部分4.7 积分转换:

如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模2n,其中n是用于表示无符号类型的位数).[注意:在二进制补码表示中,此转换是概念性的,并且位模式没有变化(如果没有截断). - 尾注]

C99的相同引用来自6.3.1.3:

否则,如果新类型是无符号的,则通过重复地添加或减去一个可以在新类型中表示的最大值来转换该值,直到该值在新类型的范围内.49)

所以我们最终得到:

-1 + (UMAX + 1)
Run Code Online (Sandbox Code Playgroud)

这是:

UMAX
Run Code Online (Sandbox Code Playgroud)


dsp*_*pyz 3

在尝试考虑可能出错的方式之后,我意识到调用函数可能会隐式地将返回值转换为更大的类型(即 unsigned int 到 unsigned long long)。然后检查该值 == -1 是否为 false。

更安全的选择是显式使用 size_t.max 作为哨兵值。我总是对在有符号和无符号类型之间进行更改感到不舒服。有时我认为更合理的方法是对所有内容进行签名(就像 Java 那样)。