【问题标题】:Equivalent of modulus (math function) in C?C中模数(数学函数)的等价物?
【发布时间】:2012-01-23 19:03:58
【问题描述】:

我在一段代码中看到警告提示

我正在比较有符号数和无符号数。
类似 int

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

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

这是真正的警告

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

这是真正的代码行

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

assert( num

}

【问题讨论】:

  • 如果您在问题中提到警告和错误,您可能需要写下实际警告,而不是您的大概版本。而如果你可以让它附上一些相关的代码,那就更好了。
  • 在上面添加了原始代码和警告。
  • 问题是,num 可能采用的预期允许范围是多少?与大小相关的表达式确实让我想知道使用 modulo-operator 或abs-function 的目标可能是什么?

标签: c operators modulus


【解决方案1】:

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

int bla;

...

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

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

【讨论】:

  • OP 说 bla 已签名,因此您不能将其更改为 size_t(未签名)。
【解决方案2】:

只需将一侧投射到另一侧。如果您将其转换为无符号,则必须确保带符号的数字不是负数 - 否则 -1 &lt; 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 保证为非负数。

【讨论】:

  • 谢谢!那么这让我想到了我的第一个问题是 C 中有一个模数(我们在数学中使用的)运算符吗? |-5|=5 的东西?
  • 你的意思是abs()而不是模数?
  • 将有符号数字转换为无符号类型是安全的,但反之则不然。
  • @Bart- 没错!类似的东西,但 abs() 不是 C++ 函数吗?
  • @Manish: 这也是一个 C 函数 :)
【解决方案3】:

正如我所看到的,您的int num 可以采用任何负值和正值直到MAX_SIZE/sizeof(int)。否则,您肯定会将num 声明为无符号整数...

通过这个附加条件扩展你的断言语句对你的情况有帮助吗?

assert( num < 0 || /* make the signed check */
  (unsigned int)num <= MAX_SIZE/sizeof(int) /* the unsigned remainder */
  );

【讨论】:

    猜你喜欢
    • 2014-06-24
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 2023-04-10
    相关资源
    最近更新 更多