что не так с этим c-кодом?

#include <stdio.h>

int main() {

    int i = 1;
    int j = -1;

    while(i)
        i++;
    while(-j)
        j--;

    i = i-1;
    j = j+1;

    printf("%d %d\n",i,j);
}

Я хочу знать диапазон int! этот код не может получить правильный ответ! Но может!

#include <stdio.h>

int main() {

    int i = 1;
    int j = -1;

    while(i > 0)
        i++;
    while(j < 0)
        j--;

    i = i-1;
    j = j+1;

    printf("%d %d\n",i,j);
}

Я не знаю, чем они отличаются!


person user3150832    schedule 26.12.2014    source источник


Ответы (4)


Оба этих примера кода полагаются на неопределенное поведение для определения максимального значения int. Переполнение не определено для числа со знаком, такого как int.

Чтобы найти максимальное значение int, вы просто читаете значение INT_MAX.

Если вы действительно хотите вычислить значение INT_MAX портативным способом, тогда вам следует изучить этот ответ: Есть ли портативный способ определить INT_MAX?

person Bill Lynch    schedule 26.12.2014
comment
Я упустил основную проблему. +1 кстати - person haccks; 26.12.2014

Попробуйте limits.h из стандартной библиотеки C. Он содержит два определения констант INT_MIN и INT_MAX, говорящие вам о минимальном и максимальном значениях int соответственно.

#include <limits.h>
#include <stdio.h>

int main(int argc, char* argv[]) {
    printf("int min: %d, int max: %d\n", INT_MIN, INT_MAX);
    return 0;
}
person foobar    schedule 26.12.2014

Вы хотите знать диапазон int?

#include <stdio.h>
#include <limits.h>

int main()
{
    printf("%d, %d\n", INT_MIN, INT_MAX);
    return 0;
}

Вывод программы

-2147483648, 2147483647

И, следуя ответу @iharob, вот похожее решение, которое достигает предела без UB.

#include <stdio.h>

int main()
{
    int integer = -1, max = 0;
    while (integer <<= 1)
        max = (max << 1) | 1;
    printf("%d\n", max);
    return 0;
}

Наконец, изящное решение (без циклов) было бы

printf("Max int %d\n", (unsigned)-1 >> 1);
person Weather Vane    schedule 26.12.2014
comment
2-й подход отличный! Хорошо работает для дополнения 2. Для необычной величины знака и дополнения до 1 начните с max = 1. - person chux - Reinstate Monica; 26.12.2014
comment
1 голос за хороший ответ - person Roh; 27.12.2014

Если вы действительно хотите вычислить значение, вы можете использовать это

int
main(int arcg, char **argv)
{
    int integer;
    int i;

    integer = 0;
    for (i = 0 ; i < 8 * sizeof (integer) - 1 ; i++)
    {
        integer |= (1 << i);
    }

    return 0;
}

и тогда максимум будет integer а минимум будет -integer

person Iharob Al Asimi    schedule 26.12.2014
comment
1) Гораздо чаще встречается минимум -integer - 1. 2) Пример этого подхода без цикла - person chux - Reinstate Monica; 26.12.2014
comment
Это предполагает, что char всегда имеет размер восемь бит. Вместо этого вы должны использовать CHAR_BIT. - person foobar; 26.12.2014