Эквивалент модуля (математическая функция) в C? - PullRequest
1 голос
/ 23 января 2012

У меня есть фрагмент кода, где я вижу предупреждение, говорящее

Я делаю сравнение между знаком и числом без знака.
Что-то вроде int <= CONSTANT / sizeof (выражение) </strong>

Каков наилучший способ исправить это?Я считаю, что нужно взять модуль числа со знаком, а затем сделать сравнение, верно?Я имею в виду, я получаю число без знака после деления на оператор sizeof в выражении.Таким образом, другой способ мог бы сделать это rhs подписанным

Если так, то есть ли функция в c, которая позволила бы мне сделать это?Я сделал быстрый поиск, и они говорят% по модулю, что явно не то, что я ищу.

Это собственное предупреждение

предупреждение: сравнение между целочисленными выражениями со знаком и без знака

и это фактическая строка кода

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

assert (num <= MAX_SIZE / sizeof (int)); // где MAX_SIZE равно #define MAX_SIZE 1000 </p>

}

Ответы [ 3 ]

2 голосов
/ 23 января 2012

Если вы знаете, что правильный операнд <= <code>INT_MAX, вы можете привести его к int.

int bla;

...

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

Но если вы можете изменить тип объекта bla на size_t (который является типом значения, которое дает sizeof), это было бы даже лучше, чем на приведение.

1 голос
/ 23 января 2012

Как я вижу, вашему int num разрешено принимать любое отрицательное значение и положительные значения вплоть до MAX_SIZE/sizeof(int). В противном случае вы бы точно объявили num как целое число без знака ...

Может ли расширение вашего утверждения с помощью этого дополнительного условия помочь в вашем случае?

assert( num < 0 || /* make the signed check */
  (unsigned int)num <= MAX_SIZE/sizeof(int) /* the unsigned remainder */
  );
1 голос
/ 23 января 2012

Просто бросьте одну сторону другой подписи.Вы должны убедиться, что число со знаком не является отрицательным, если вы приведете его к неподписанному - иначе сравнение -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 гарантированно неотрицателен.

...