【问题标题】:how to avoid unsigned integer compare with signed number?如何避免将无符号整数与有符号数进行比较?
【发布时间】:2022-11-29 11:26:59
【问题描述】:
void main() {
    unsigned int a = 0;
    if (a - 10 < 0) {
        printf("error!\n");
    }
}

我们知道这种比较是行不通的,因为 a-10 是一个很大的无符号整数,它不能小于 0。

为了避免这种情况,我尝试这样做:

void main() {
    unsigned int a = 0;
    int b = 0;
    if (a - 10 < b) {
        printf("error!\n");
    }
}

这将使用 Visual Studio 2022 17.2.4 获得 warning C4018

但是,当我使用 gcc 4.8.5 时,根本没有任何警告。

有没有办法避免编码器将有符号数与无符号变量进行比较?

【问题讨论】:

  • 为什么不这样做呢? (int)a - 10

标签: c visual-studio security gcc


【解决方案1】:

如果将 unsigned int 操作数转换为 int

if ((int)a - 10 < 0)

然后使用类型int 完成所有数学运算。

或者,你可以做一点代数:

if (a < 10)

彻底避免问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 2021-03-28
    • 2014-06-08
    相关资源
    最近更新 更多