c - C 比较 'x < 0' 其中 'x' 的类型是任意的,即可能是无符号的
问题描述
给定:
定义为的类型TheValueT
可以任意配置,例如uint8_t
或int64_
。让有一些代码:
TheValueT x = ...;
... do something to 'x' ...
if( x < 0 ) {
/* Do something. */
}
问题:
碰巧如果TheValueT
定义为无符号类型,编译器会抱怨“由于类型范围有限,条件始终为真......”。
问题:
如何在让TheValueT
仍然是任意整数类型的同时避免编译器警告?该解决方案应适用于最广泛的 C 编译器。
解决方案
编写测试的一种简单而安全的方法是:
TheValueT x = /* ... */;
if (x < 1 && x != 0) {
// do something
}
无论如何,一个足够聪明的编译器可能会对此发出警告,但是对于可以编写以涵盖所有可能的整数类型(包括扩展类型)的任何正确替代方案也是如此。这确实解决了我实施中的警告。
没有任何替代方法需要涉及定义的值的算术计算x
在所有情况下都会产生正确的结果——这些会遇到值x
在其或其他类型范围的极端值的问题。
这确实假设TheTypeT
必须是整数类型。如果浮动类型也是可能的,那么您最好的选择可能是忍受警告,或者使用编译器标志在生产构建期间关闭该特定警告。
推荐阅读
- java - 使用 Chaquopy 将多个列表从 Python 返回到 Java
- docker - gulp 未在 Dockerfile 中运行:在 / 中找不到本地 gulp
- php - 变量定义导致 wordpress 忽略布局/样式
- html - “输入绝对”不会像“div absolute”那样从左到右增长?
- angular - 如何在 Angular 10 中更改 Angular favIcon
- android - 有谁知道如何更改布局 xml 以使工具栏不覆盖项目?
- python - Django URL 传递参数
- azure - Azure 管道 vcpkg 安装输出“错误获取规范化”
- flutter - 为某些浏览器打开 Flutter Web (PWA)
- javascript - 为什么我的数组没有作为新行追加到我的表中?它什么时候是未定义的?JavaScript / HTML