Рубрики

Что произойдет, если цикл до Максимума подписанного и неподписанного в C / C ++?

Давайте посмотрим на следующий фрагмент кода в C / C ++.

// Пример без знака
#include<stdio.h>

void fun1()

{

    unsigned char i;

    for (i=0; i<256; i++)

        printf("%d ",i);

}

  

int main()

{

    fun1();

    return 0;

}

Выход:

 Infinite Loop 

Объяснение:

Мы знаем, что размер символьной переменной составляет 8 бит или 1 байт. Следовательно, согласно основанию 2 представления десятичных чисел, максимальное число в 8 битах равно 11111111. Это происходит потому, что диапазон чисел без знака в 8 битах варьируется от 0 до 2 8 -1.

Сейчас (11111111) 2 = (255) 10

Если мы доведем цикл до 255, начиная с 0, он выполнит инструкцию в цикле 256 раз (как 0, так и 255 включительно). Когда цикл достигает значения (255) 10 , после его выполнения переменная «i» увеличивается на 1, то есть идет по арифметике дополнения до 2s,

(11111111) 2 + (00000001) 2 = (00000000) 10

Примечание: конец переноса в этом случае отбрасывается; следовательно, последнее увеличенное число равно 0, что приводит к повторному выполнению цикла, следовательно, цикл выполняется в течение бесконечного времени. Следовательно, вышеуказанного условия можно избежать, если мы установим предел для unsigned char i, который будет меньше 255, а не 256.

Теперь рассмотрим приведенную ниже программу:

// Пример подписанного символа
#include<stdio.h>

  

void fun2()

{

    signed char i;

    for (i=0; i<128; i++)

        printf("%d ",i);

}

  

int main()

{

    fun2();

    return 0;

}

Вывод на GCC (неопределенное поведение в стандарте):

 Infinite Loop  

Диапазон знаковых символов принадлежит от -2 7 до 2 7 -1, следовательно, он также применяется для бесконечного выполнения, если предел <128.

Обратите внимание, что дополнение 2s к (127) 10 равно (01111111) 2, добавляя 1 к которому мы получим (10000000) 2, то есть — (128) 10 при расчете по форме дополнения 2s.

Итак, как сделать цикл от 0 до максимума (255 или 128 или любой другой максимальный предел)?
Один из способов сделать это ниже.

// Один из циклов до максимума без знака в C / C ++
#include<stdio.h>

void fun1()

{

    unsigned char i = 0;

    do

    {

        printf("%d ", i);

        i++;

    }

    while (i > 0);

}

int main()

{

    fun1();

    return 0;

}

Вывод: числа от 0 до 255

// Один способ зацикливания до максимума подписанного в C / C ++
// (То же, что и выше, за исключением первого утверждения)
#include<stdio.h>

void fun2()

{

    signed char i = 0;

    do

    {

        printf("%d ", i);

        i++;

    }

    while (i > 0);

}

int main()

{

    fun2();

    return 0;

}

Вывод в GCC: числа от 0 до 127


Примечание. В C переполнение со знаком является неопределенным поведением, поэтому приведенное выше решение может работать не на всех компьютерах для чисел со знаком. Кроме того, выходные данные, показанные выше для подписанного, могут не быть одинаковыми на всех машинах. Поведение хорошо определено для чисел без знака.

Следующее упомянуто в C99 здесь .

О неподписанных:
Вычисления с участием беззнаковых операндов никогда не могут переполниться, поскольку результат, который не может быть представлен результирующим целочисленным типом без знака, уменьшается по модулю на число, которое на единицу больше наибольшего значения, которое может быть представлено результирующим типом.

О подписи:
Примером неопределенного поведения является поведение при целочисленном переполнении.

Эта статья предоставлена Пранджалом Матуром . Если вам нравится GeeksforGeeks и вы хотите внести свой вклад, вы также можете написать статью и отправить ее по почте на contrib@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

Что произойдет, если цикл до Максимума подписанного и неподписанного в C / C ++?

0.00 (0%) 0 votes