如何比较已签名和未签名(并避免问题)

时间:2014-04-03 18:42:19

标签: c

最近我在C中听到签名/未签名的比较可能很棘手,例如Signed/unsigned comparisons以及其他一些问题。

我的问题是 - 如果我们必须比较singed类型和无符号(例如,包括=,&gt;,&lt;运算符),存在哪些策略以避免因此类比较而产生的问题?< / p>

或者我们应该确保始终只将intintunsignedunsigned进行比较?

PS。也很高兴知道何时这样的比较是危险的?

1 个答案:

答案 0 :(得分:2)

最好确保您的类型提前匹配。但如果你不能:

如果您知道此时int肯定不会保留负值,请将其投放到unsigned

如果您知道unsigned值将小于INT_MAX,请将其投放到int

如果这些都不成立,则将两个值都转换为足以容纳所有可能值的类型,以便能够处理。另一种可能性(当没有足够大的类型时)是使用两个比较:首先将int与0进行比较,如果它是非负的,则将其转换为unsigned并进行比较unsigned值。

如果您没有投出任何内容,int将被投放到unsigned,但如果它是您想要的,最好明确这一点要做。

int具有负值时,将unsignedint进行比较将无法正常工作。这是因为它将隐式转换为unsigned,这将改变其值。