Почему я получаю предупреждение компилятора за это условие? - PullRequest
1 голос
/ 09 августа 2011
if(nowPlayingIndex-1 >= 0){ }

Я использую это условие в функции и получаю следующее предупреждение компилятора в xCode:

Сравнение выражения без знака> = 0 всегда верно.

Как это может быть правдой? Если значение nowPlayingIndex равно <= 0, то указанное выше условие ложно.

Большое спасибо.

Ответы [ 11 ]

3 голосов
/ 09 августа 2011

Я уверен, что тип nowPlayingIndex является беззнаковым целым типом.Если это так, то nowPlayingIndex -1 будет также беззнаковым целочисленным типом, который никогда не может быть отрицательным, следовательно, nowPlayingIndex -1 всегда больше или равно 0.

Следовательно, выследует написать:

if ( nowPlayingIndex  >= 1 ) 
2 голосов
/ 09 августа 2011

nowPlayingIndex явно без знака, поэтому nowPlayingIndex-1 никогда не может быть отрицательным. Поэтому условие всегда верно, так как компилятор предупреждает вас.

1 голос
/ 09 августа 2011

nowPlayinfIndex кажется неподписанным.Это значит, что это всегда позитивно.Если вы укажете отрицательное значение, у вас будет переполнение буфера (недостаточное количество?)

Посмотрите, как эти вещи работают в двоичном формате ... Возьмите 8-разрядное целое число со знаком, например:

10000000 (-127)
10000001 (-126)

с беззнаковым:

10000000 (127)
10000001 (128)

РЕДАКТИРОВАТЬ: фиксированные числа

Самый левый бит или бит знака определяет, является ли ваше число + или -.Когда это 1, вы можете считать его -127, поэтому, когда вы добавляете его к вашему промежуточному итогу, вы получаете отрицательное число.Однако для 8-битного целого числа UNSIGNED бит знака имеет значение +127.По этой же причине целые числа со знаком не могут хранить такие большие числа как беззнаковые.

0 голосов
/ 09 августа 2011

Переменная nowPlayingIndex, вероятно, представляет собой целое число без знака , представляющее положительное число , оно всегда> = 0.

0 голосов
/ 09 августа 2011

Вы не правы, 0 - 1 может быть больше 0. Я покажу вам:

$ cat foo.cpp

#include <iostream>

int main()
{
    unsigned int foo = 0;
    ::std::cout << (foo - 1) << "\n";
    return 0;
}

$ g++ -O3 foo.cpp -o foo

$ ./foo
4294967295

Вот, пожалуйста.

0 голосов
/ 09 августа 2011

Это означает именно то, что написано на банке. nowPlayingIndex без знака, nowPlayingIndex - 1 также без знака, и все значения без знака> = 0.

Попробуйте вместо этого использовать подписанные значения. С тех пор, как я переписал все свои вещи для использования значений со знаком (точнее, моего собственного int32), все стало проще, а правильность легче обеспечить.

Если это слишком много усилий или невозможно, просто используйте nowPlayingIndex> = 1.

0 голосов
/ 09 августа 2011

, если nowPlayingIndex - беззнаковый символ

unsigned char nowPlayingIndex = 0;
nowPlayingIndex = nowPlayingIndex - 1; // 255 (UCHAR_MAX in limits.h)
0 голосов
/ 09 августа 2011

Расширяя более ранние правильные ответы, если nowPlayingIndex == 0, то nowPlayingIndex - 1 является максимальным значением его типа, например, UINT_MAX, которое может быть 4294967295.

Вы, вероятно, хотите написать:

if (nowPlayingIndex > 0) { ... }

или

if (nowPlayingIndex >= 1 { ... }
0 голосов
/ 09 августа 2011

Это немного странно, но попробуйте следующее и посмотрите, поможет ли это.

if ((nowPlayingIndex - 1) >= 0)
{
    //logic
}
0 голосов
/ 09 августа 2011

Вы не упомянули тип данных nowPlayingIndex см. Мой комментарий.Если это unsigned int, то это ваша проблема.

Ради интереса попробуйте вычесть 1 из целого числа без знака, инициализированного значением 0. Проверьте ваш результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...