首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使Visual警告用于无符号比较

使Visual警告用于无符号比较
EN

Stack Overflow用户
提问于 2012-04-13 21:33:12
回答 3查看 672关注 0票数 0

此代码在用Visual 2010编译时

代码语言:javascript
复制
#include <cstdlib>
#include <cstdio>

int numbers[] = { 23, 24, 25, 25, 28, 20, 20 };

int main(void) {
    int d = -1, x=0;
    size_t count = sizeof(numbers) / sizeof(numbers[0]);

    if (d <= (sizeof(numbers) / sizeof(numbers[0]))-2)
        x = numbers[d+1];

    if (d <= count-2)
        x = numbers[d+1];
}

if (d <= count-2)上给出有符号/无符号的不匹配警告,但在if (d <= (sizeof(numbers) / sizeof(numbers[0]))-2)上不给出警告。为什么会这样呢?我启用了所有警告。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-13 23:07:15

在这种情况下,VisualC++编译器没有发出警告C4018是一个错误。参见Microsoft错误报告,“警告大小操作符的C4018 (签名/无符号不匹配)。”

这个问题似乎只是间接地与sizeof的使用有关。在比较中涉及无符号类型的常量值的其他情况下,编译器也无法发出警告。例如,如果将const-qualification添加到count中,则即使进行第二次比较也不会发出C4018。

票数 1
EN

Stack Overflow用户

发布于 2012-04-13 21:35:19

我的猜测是,它将2视为int,因此由于括号的存在,将(sizeof(numbers) / sizeof(numbers[0]))-2)提升为int,因此comaprison是int < int

票数 0
EN

Stack Overflow用户

发布于 2012-04-13 21:38:23

size_t被定义为无签名,因此您将得到一个签名的无签名冲突。

请注意,由于sizeof是在编译期间计算的,并且正在被常量值替换,因此它不会抱怨符号不匹配,但是在另一个表达式中,您显式地将该值转换为一个size_t变量,当您试图与有符号数字进行比较时,该变量可能会溢出。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10148591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档