首页 > 解决方案 > C 比较 'x < 0' 其中 'x' 的类型是任意的,即可能是无符号的

问题描述

给定:

定义为的类型TheValueT可以任意配置,例如uint8_tint64_。让有一些代码:

TheValueT   x = ...;

... do something to 'x' ...

if( x < 0 ) {
   /* Do something. */
}

问题:

碰巧如果TheValueT定义为无符号类型,编译器会抱怨“由于类型范围有限,条件始终为真......”。

问题:

如何在让TheValueT仍然是任意整数类型的同时避免编译器警告?该解决方案应适用于最广泛的 C 编译器。

标签: ccomparisonunsigned-integersignedness

解决方案


编写测试的一种简单而安全的方法是:

TheValueT x = /* ... */;

if (x < 1 && x != 0) {
    // do something
}

无论如何,一个足够聪明的编译器可能会对此发出警告,但是对于可以编写以涵盖所有可能的整数类型(包括扩展类型)的任何正确替代方案也是如此。这确实解决了我实施中的警告。

没有任何替代方法需要涉及定义的值的算术计算x在所有情况下都会产生正确的结果——这些会遇到值x在其或其他类型范围的极端值的问题。

这确实假设TheTypeT必须是整数类型。如果浮动类型也是可能的,那么您最好的选择可能是忍受警告,或者使用编译器标志在生产构建期间关闭该特定警告。


推荐阅读