×
Traktatov.net » Освой самостоятельно С++ за 21 день » Читать онлайн
Страница 27 из 448 Настройки

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

Переполнение беззнаковых целых

Что случится, если при использовании беззнаковых длинных целых превысить их предельный максимум?

Когда беззнаковое целое достигает своего максимального значения, при очередном инкременте оно сбрасывается в нуль и отсчет начинается сначала, как в автомобильном одометре. В листинге 3.4 показано, что произойдет при попытке поместить слишком большое число в переменную типа short.

Листинг 3.4. Пример переполнения беззнаковой целой переменной.

1: #include

2: int main()

3: {

4:    unsigned short int smallNumber;

5:    smallNumber = 65535;

6:    cout << "small number:" << smallNumber << endl;

7:    smallNumber++;

8:    cout << "small number:" << smallNumber << endl;

9:    smallNumber++;

10:   cout << "small number:" << smallNumber << endl;

11:   return 0;

12: }


Результат:

small number:65535

small number:0

small numbar:1


АНАЛИЗ: В строке 4 объявляется переменная smallNumber типа unsigned short int, которая на моем компьютере является двухбайтовой, способной хранить значение между 0 и 65 535. В строке 5 переменной smallNumber присваивается максимальное значение, которое в строке 6 выводится на экран.

В строке 7 переменная smallNumber увеличивается на 1. Приращение осуществляется с помощью оператора инкремента, имеющего вид двух символов плюс (++). Следовательно, значение переменной smallNumber должно стать 65 536. Однако переменная типа unsigned short int не может хранить число, большее 65 535, поэтому ее значение сбрасывается в 0, который и выводится в строке 8.

В строке 9 переменная smallNumber вновь увеличивается на единицу, после чего ее новое значение выводится на экран.

Переполнение знаковых целочисленных значений

Знаковые целые отличаются от беззнаковых тем, что половина этих значений всего диапазона — отрицательные числа. При выходе за пределы максимального положительного значения переменная принимает минимальное отрицательное значение. В листинге 3.5 показано, что происходит, если добавить единицу к максимальному положительному числу, хранящемуся в переменной типа short int.

Листинг 3.5. Пример переполнения знаковой целой переменной

1: #include

2: int main()

3: {

4:    short int smallNumber;

5:    smallNumber = 32767;

6:    cout << "small number:" << smallNumber << endl;

7:    smallNumber++;

8:    cout << "small number:" << smallNumber << endl;

9:    smallNumber++;

10:   cout << "small number:" << smallNumber << endl;

11:   return 0;

12:}


Анализ: В строке 4 переменная smallNumber объявляется на этот раз короткой целой (short int) со знаком (если в объявлении переменной ключевое слово unsigned отсутствует, т.е. эта переменная явно не объявляется беззнаковой, то подразумевается ее использование со знаком). В остальном эта программа выполняет те же действия, что и предыдущая, но на экран выводятся совсем другие результаты. Чтобы до конца понять, почему получены именно такие результаты, нужно знать, как представляются числа со знаком в двухбайтовом целом значении.