我有一段代码,我看到警告说
我正在对有符号和无符号的数字进行比较 像int< = CONSTANT / sizeof(表达式)
之类的东西纠正此问题的最佳方法是什么?我相信采用有符号数的模数然后进行比较,对吗?我的意思是我在表达式上使用sizeof运算符除以后得到无符号数。所以另一种方法是让这个rhs签名
如果是,那么c中的函数会让我这样做吗?我做了一个快速搜索,他们说模数%,显然不是我想要的。
这是实际警告
警告:有符号和无符号整数表达式之间的比较
这是实际的代码行
functionA(......,int num,.....){
断言(num< = MAX_SIZE / sizeof(int)); //其中MAX_SIZE为#define MAX_SIZE 1000
}
答案 0 :(得分:2)
如果您知道正确的操作数是< = INT_MAX
,则可以将其强制转换为int
。
int bla;
...
if (bla < (int) sizeof expr) {
...
}
但是如果你可以将对象bla
的类型更改为size_t
(这是sizeof
产生的值的类型),那么它甚至会比投射更好。
答案 1 :(得分:1)
将一方投入其他签名。如果将其转换为无符号,则必须确保签名的数字不是负数 - 否则-1 < 100
的比较将不会产生预期的结果,因为(unsigned)(-1) == UINT_MAX
- 或者无符号数字没有'如果您将其转换为签名,则会溢出。在这些情况下,添加一个额外的条件来治疗它们。
对于上述特定情况,我会使用
assert(num <= (int)(MAX_SIZE/sizeof(int)));
// num <= MAX_SIZE/(int)sizeof(int) if I'm in a mean mood
如果num
可能是否定的,
assert((unsigned)num <= MAX_SIZE/sizeof(int));
如果保证num
是非负的。
答案 2 :(得分:1)
在我看到这一点时,您的int num
可以获取任何负值和正值,最高可达MAX_SIZE/sizeof(int)
。否则你肯定会将num
声明为无符号整数...
在你的情况下,通过这个附加条件帮助扩展你的断言声明吗?
assert( num < 0 || /* make the signed check */
(unsigned int)num <= MAX_SIZE/sizeof(int) /* the unsigned remainder */
);