最近我在C中听到签名/未签名的比较可能很棘手,例如Signed/unsigned comparisons以及其他一些问题。
我的问题是 - 如果我们必须比较singed类型和无符号(例如,包括=,&gt;,&lt;运算符),存在哪些策略以避免因此类比较而产生的问题?< / p>
或者我们应该确保始终只将int
与int
和unsigned
与unsigned
进行比较?
PS。也很高兴知道何时这样的比较是危险的?
答案 0 :(得分:2)
最好确保您的类型提前匹配。但如果你不能:
如果您知道此时int
肯定不会保留负值,请将其投放到unsigned
。
如果您知道unsigned
值将小于INT_MAX
,请将其投放到int
。
如果这些都不成立,则将两个值都转换为足以容纳所有可能值的类型,以便能够处理。另一种可能性(当没有足够大的类型时)是使用两个比较:首先将int
与0进行比较,如果它是非负的,则将其转换为unsigned
并进行比较unsigned
值。
如果您没有投出任何内容,int
将被投放到unsigned
,但如果它是您想要的,最好明确这一点要做。
当int
具有负值时,将unsigned
与int
进行比较将无法正常工作。这是因为它将隐式转换为unsigned
,这将改变其值。