Найти тему

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

Оглавление

Целочисленное значение в С++ – это тип данных, позволяющий хранить внутри целые числа с положительными и отрицательными знаками, включая 0. В С++ доступно четыре базовых целочисленных типа.

Главное отличие всех встроенных целочисленных типов в том, что они разного битового размера. Чем больше размер целочисленного типа, тем больший диапазон значений он может хранить внутри.

Минимальные размеры целочисленных типов данных в C++:

  • short – 16 бит;
  • int – 16 бит (32 бита на большинстве современных компьютеров);
  • long – 32 бита;
  • long long – 64 бита.
Напомню, что стандарт С++ гарантирует минимальный размер типов данных, но не гарантирует конкретный размер, который может отличаться в зависимости от версии компилятора или компьютера.

Целочисленные типы данных со знаком (signed)

По умолчанию, все целочисленные типы позволяют использовать знак "-", для того, чтобы указать, что число отрицательное. Знак плюса, для указания, что число положительное, по соглашению не пишется. То есть числа без знака минус, автоматически положительные.

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

По соглашению, целочисленные типы со знаком пишутся в сокращенном варианте:

Полная запись подразумевает использование необязательного ключевого слова signed (со знаком):

-2

И необязательного уточняющего суффикса int (целочисленное значение):

-3

Так как это мало того, что существенно тратит время программиста при написании имен, к тому же является избыточным, потому что тип и так целочисленный и он и так по умолчанию может хранить значения со знаками. Кроме того, повторное указание суффикса int повышает сложность отличия переменных типа int от других целочисленных типов данных.

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

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

Хм, начнем с вопроса! А какой же диапазон значений может храниться в одной байте данных. И для начала обратимся к простой математической формуле.

Чтобы вычислить возможное количество значений (диапазон), которые может хранить переменная, используйте формулу 2**n ("**" – знак возведения в степень), где n – размер битов, которые может содержать переменная, заданного типа данных.

Если же говорить предметно, о целочисленных переменных. То здесь вмешивается еще один фактор: со знаком такая переменная или нет.

Немного посчитаем:

8-ми битная целочисленная переменная, если мы будем использовать нашу формулу, должна вместить 256 возможных значений. Но, что если один бит будет всегда отводиться на знак? Тогда целочисленное значение размером 8 битов (1 байт) будет содержать тоже 256 возможных значений, но вот диапазон их будет: от - 128 до 127

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

Диапазон 8-битного значения со знаком:

от -128 до 127

Диапазон 16-битного значения со знаком:

от -32 768 до 32 767

Диапазон 32-битного значения со знаком:

от -2 147 483 648 до 2 147 483 647

Диапазон 64-битного значения со знаком:

от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807

Ах да, если вам нравится считать. Вот вам формула для вычисления:

Целочисленная переменная, которая весит n бит будет иметь диапазон от

-(2**n-1) до (2**n-1)-1

А зачем это все вообще нужно знать?

Конечно же, чтобы не произошло переполнения целочисленной переменной!

Что такое переполнение значения и как оно возникает?

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

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

И буду честным, в Visual Studio программа с переполнением значения вообще отказалась компилироваться.

-4

И вот что получилось, когда я начал процесс компиляции:

-5

Какой вывод из всего этого?

Да все просто.

Понимаете, что объект скорее всего будет хранить больший диапазон, чем позволяет его нынешний тип? Используйте тип большего диапазона!

Деление целочисленных значений со знаком

Когда вы начнете заниматься делением целочисленных значений друг на друга. Вы столкнетесь с одним моментом, который нужно учитывать.

Если будете делить числа, результатом (частным) который выступит целое число. Все будет в порядке. Все будут довольны и рады, да!

Но вот, стоит вам попробовать разделить, например 19 / 7 и вы не получите дробный результат. По идее, ваш результат должен быть 2,714...

Но! Если ваши переменные целочисленные, они после деления отбросят все цифры после запятой и покажут вам целое число 2.

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

Что ж, на этом сегодня все.

Спасибо за внимание. Надеюсь, материал был интересен и полезен.

Оставляйте лайки и задавайте вопросы в комментариях.

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

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

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