2016-01-10 3 views
0

я пишу код, как этотпочему переполнение при сравнении долго долго с Int

int reverse(int x) { 
    long long res; 

    ...... 

    if(x>0&&res>INT_MAX||x<0&&res>INT_MAX+1){ 
     return 0; 
    } 
    ...... 
} 

Это показывает переполнение, но когда я добавить преобразование к этому он соответствует

int reverse(int x) { 
    long long res; 

    ...... 

    if(x>0&&res>(unsigned long long)INT_MAX||x<0&&res>(unsigned long long)INT_MAX+1){ 
     return 0; 
    } 
    ...... 
} 

Может кто-нибудь, пожалуйста, объясните для меня в чем проблема?

+3

Просьбы предоставить полный образец и ввод/ожидаемый выход/фактический вывод, который демонстрирует вашу проблему. Также понимайте, что ответы C и C++ могут легко отличаться. – chris

+2

По определению, 'INT_MAX' является наибольшим представимым' int'. Как добавить одно к нему * не * переполнение? –

ответ

3

INT_MAX+1 оценивается как целочисленное добавление двух int. Поскольку результат не соответствует диапазону значений, который может быть представлен как int, вы видите переполнение.

(unsigned long long)INT_MAX+1 оценивается как целочисленное добавление двух unsigned long long. Поскольку обе стороны оператора и результирующий результат находятся в пределах диапазона значений, которые могут быть представлены как unsigned long long, переполнение не происходит.

+0

Так что (без знака длинный) INT_MAX + 1 равно (без знака длинного длинного) (INT_MAX + 1), а не ((без знаковой длинной длинной) (INT_MAX) +1 справа? – Zongyang

+0

@ Zongyang, no. Оценка '(INT_MAX + 1) 'вызывает сначала переполнение целых чисел. Вы должны сделать одно из чисел перед добавлением. –

+0

ОК, я получил его, моя точка похожа на то, что (без знака длинный) 100 + 1 равно (без знака long long) (100 +1), а не ((unsigned long long) (100)) + 1? Я не совсем понимаю это. – Zongyang

2
INT_MAX + 1 

В этом подвыражении, тип обоих операндов + являются int, поэтому тип результата будет int, вызывая целочисленное переполнение.

Однако, если вы накладываете один операнд unsigned long long:

(unsigned long long)INT_MAX + 1 

Тип результата, если unsigned long long, таким образом, нет переполнения, просто так.

+0

(без знака длинный) INT_MAX + 1 实际上 是 (без знака длинный длинный) (INT_MAX + 1) 而 不是 ((без знака длинный) (INT_MAX) +1 是 这样? – Zongyang

+0

Нет, это неверно. –

-1

Что вызывает переполнение является выражением

INT_MAX+1 

Поскольку INT_MAX имеет тип INT (32 бит целое число), INT_MAX + 1 превышает максимальное значение Int. После того, как вы бросили его в беззнаковое длинное длинное (64 разрядных целое число),

(unsigned long long)INT_MAX 

теперь значительно ниже максимального значения для его типа и

(unsigned long long)INT_MAX + 1 

действует

+0

'int' не обязательно 32 бит, а' unsigned lo ng' не обязательно 64 бит. Тем не менее, это не имеет значения. – juanchopanza

Смежные вопросы