Найти тему

Обзор беззнаковых целочисленных типов данных: правила определения, споры о переполнении и область применения

Оглавление

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

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

Правила определения беззнаковых целочисленных типов и их диапазон

Для определения неотрицательных целочисленных значений используется ключевое слово unsigned.

Диапазон беззнакового значения целочисленного типа весом 1 байт от 0 до 255. Если провести параллель с целочисленными типами со знаком, то мы увидим, что они хранят одинаковое количество значений. Только в случае типов со знаком, половина диапазона используется для хранения отрицательных чисел.

Ниже приведен диапазон беззнаковых целочисленных значений:

  • 8 бит (1 байт) – от 0 до 255;
  • 16 бит (2 байта) – от 0 до 65 535;
  • 32 бит (4 байта) – от 0 до 4 294 967 295;
  • 64 бит (8 байт) – от 0 до 18 446 744 073 709 551 615.

Формула для вычисления диапазона в зависимости от размера беззнаковых целочисленных типов, выглядит так:

Диапазон беззнакового целочисленного типа данных размером N бит равен от 0 до (N**2)-1

Споры о переполнении беззнаковых целочисленных типов

В стандарте С++ (C++11 6.2.5 / 9) четко прописано следующее:

Вычисления с использованием беззнаковых операндов никогда не могут переполниться.

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

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

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

Разберем на практическом примере?

-2

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

-3

Да, в каждой переменной типа short сработала формула, которую мы разобрали выше. Вот так работает эта формула:

Для переменной x: 65536 / 65536 и сохранить остаток от деления 0;

Для переменной у: 65537 / 65536 и сохранить остаток от деления 1.

и т.д.

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

Просто замените значения после операторов присваивания на -1, -2 и т.д.

И вот что у вас получится:

-4

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

-5

Вроде бы, ничего необычного. Просто вычитаем из одного беззнакового значения другое. Ага, как бы не так. Скомпилируем эту программу?

-6

Как вам такой результат?

Да, тут работает тот же циклический переход к близкому значению в верхнем крае диапазона.

Возникает вопрос: а стоит ли вообще использовать беззнаковые целочисленные типы?

Область применение беззнаковых целочисленных типов данных

Приведенные выше примеры показывают лишь то, что не стоит использовать unsigned types просто так. В действительности, у этих типов есть несколько областей применения, которые мы с вами разберем когда-нибудь (если я не брошу вести канал).

Вот эти области:

  • битовые манипуляции;
  • индексация массивов;
  • разработка и поддержка систем с внутренними ограничениями по использованию процессора/памяти.

И на этом мы завершим нашу статью. Буду честным, сегодня я недоволен обзором, который написал. Я более 5 дней разбирался в этой теме и у меня осталось все еще много вопросов.

Но, получилось, то что получилось. Спасибо за внимание.

Оставляйте комментарии, если вам есть что сказать.

Подписывайтесь на канал, чтобы не пропустить выход новых материалов.

Наука
7 млн интересуются