1

我有一段代码,我看到一条警告说

我正在比较有符号数和无符号数。
像 int <= CONSTANT/sizeof(expression)

纠正此问题的最佳方法是什么?我相信取有符号数的模数然后进行比较,对吗?我的意思是在表达式上除以 sizeof 运算符后得到无符号数。所以另一种方法可能是让这个 rhs 签名

如果是这样,c中有一个函数可以让我这样做吗?我做了一个快速搜索,他们说 % for modulo 这显然不是我想要的。

这是实际的警告

警告:有符号和无符号整数表达式之间的比较

这是实际的代码行

函数A(......,整数,......){

assert( num <= MAX_SIZE/sizeof(int));//其中 MAX_SIZE 是 #define MAX_SIZE 1000

}

4

3 回答 3

2

如果您知道正确的操作数是 <= INT_MAX,则可以将其强制转换为int.

int bla;

...

if (bla < (int) sizeof expr) {
    ...
}

但是,如果您可以将对象的类型更改blasize_t(这是产生的值的类型sizeof),那将比强制转换更好。

于 2012-01-23T19:10:34.897 回答
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));

ifnum保证为非负数。

于 2012-01-23T19:09:40.363 回答
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 */
  );
于 2012-01-23T19:44:59.760 回答