C中的模数(数学函数)的等价?

时间:2012-01-23 19:03:59

标签: c operators modulus

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

我正在对有符号和无符号的数字进行比较 像int< = CONSTANT / sizeof(表达式)

之类的东西

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

如果是,那么c中的函数会让我这样做吗?我做了一个快速搜索,他们说模数%,显然不是我想要的。

这是实际警告

  

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

这是实际的代码行

  

functionA(......,int num,.....){

     

断言(num< = MAX_SIZE / sizeof(int)); //其中MAX_SIZE为#define   MAX_SIZE 1000

     

}

3 个答案:

答案 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 */
  );