Что такое целочисленное значение

Что такое целочисленное значение

Я написал программу на C ++ для случаев переключения, чтобы понять:

Моя путаница в том, что я объявил int x = 65

и вывод этого кода

Как это возможно? Почему это относится к значению ASCII 65 ?

Решение

‘A’ это буквальный символ. Это выглядит как A но на самом деле это сопоставляется некоторому целочисленному значению в зависимости от набора символов. В ASCII это значение 65 , Так что же происходит ‘A’ повышен до int со значением, определяемым набором символов ( 65 в этом случае), а затем он сравнивается со значением x , Так как они имеют одинаковую ценность One печатается.

Это поведение, определяемое реализацией. C ++ не предписывает, каким должен быть набор символов, поэтому этот код может распечатать любой из ваших других выходных данных. Это зависит только от того, какое значение отображает набор символов ‘A’ к. Вот почему такие вещи, как

Это плохо, потому что это зависит от магические числа в то время как

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

Другие решения

‘A’ является 65.

Потому что ваша система использует кодировку ASCII для символьных литералов, а символьные литералы являются числами. Вы написали ‘A’ в вашем коде, но на самом деле (при условии ASCII) это означает (char)65 ,

И, очевидно, 65 — это 65.

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

Да, это связано с тем, что значение ASCII A равно 65.

В операторе switch вы используете x , которое является целым числом, но во всех случаях используются только символы (тип char ). Так что где-то до принятия решения x равняется ‘A’ компилятор должен сделать неявное преобразование из char в int и кастинг ‘A’ в int дает 65 — при условии, что ваша реализация компилятора использует ASCII, а не какой-либо другой набор символов.

Объекты типа char включая символьные литералы принадлежат целочисленным типам, и внутренне они хранятся как целочисленные значения (коды), которые представляют символы.

Согласно стандарту C ++ (3.9.1 Основные типы)

1 Объекты, объявленные как символы (char), должны быть достаточно большими для хранения
любой член базового набора символов реализации. Если
символ из этого набора хранится в символьном объекте, интеграле
значение этого символьного объекта равно значению одиночного
символ буквальная форма этого персонажа.

и (4.5 Интегральные акции)

1 Значение типа integer, отличное от bool, char16_t, char32_t или
wchar_t, у которого ранг целочисленного преобразования (4.13) меньше, чем ранг
int может быть преобразовано в значение типа int, если int может представлять все
значения типа источника; в противном случае исходное значение может быть
преобразуется в значение типа unsigned int.

Поэтому, когда выражение в операторе switch

оценивается, его значение сравнивается со значениями, преобразованными в тип int каждого символьного литерала, используемого в качестве метки оператора switch.

Таким образом, если символы в вашей системе внутренне представлены кодами ASCII, то, например, значение 65 в десятичном виде или 0x41 в шестнадцатеричном формате представляет символьный литерал «A».

Таким образом, сравнение

То, что вы испытываете, является результатом Неявное преобразование .

Интегральное продвижение

Значения малых целочисленных типов (таких как char) могут быть преобразованы в значения больших целых типов (таких как int). В частности, арифметические операторы не принимают типы, меньшие, чем int, в качестве аргументов, и интегральные преобразования автоматически применяются после преобразования lvalue в rvalue, если это применимо. Это преобразование всегда сохраняет значение.

Читайте также:  Как убрать звонки в одноклассниках

Следующие неявные преобразования классифицируются как интегральные продвижения:

  • подписанный символ или подписанный короткий может быть преобразован в int;

Это означает, что когда знаковый символ (например, ‘char’) сравнивается с целым числом, его тип переводится в целое число.

В вашей системе «A» определяется как значение 0x41 или десятичное 65.

Ваш оператор switch принимает целое число, также 65, и сравнивает его с «A».

«А» переводится в целое число и получает значение 65.

Это эффективно делает следующее:

Заметка Значение, данное char, зависит от конкретной реализации, поэтому это может быть неверно на другом компьютере!

Если вы идете в http://www.asciitable.com/ тогда вы увидите, что заглавный символ «A» имеет значение ASCII 65. Когда вы используете переключатель (x) и задаете вопрос о значении «A», которое является символом, тогда символ преобразуется (typecasted) в целое число по десятичному значению ASCII;

Когда вы пишете любое письмо между апострофами, вы называете их символом. Это означает, что их можно назвать числовым значением. В твоем случае, ‘A’ относится к значению ASCII 65, в то время как ‘B’ относится к 66 и ‘C’ относится к 67. Затем компилятор неявно преобразует значение int в значение char, где это требуется, как в вашем случае. Смотрите пример ниже:

ПРИМЕЧАНИЕ. Если вы пишете «A», то это строка, а не значение char. Ваш компилятор не может выполнить преобразование из int в строку. Например, этот фрагмент кода выдаст ошибку компиляции:

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

Но мы МОЖЕМ сделать следующее:

С другой стороны, вы можете выполнять НЕКОТОРЫЕ математические операции над значением типа char, например, значением int, и мы также можем использовать значение int для ссылки на определенный тип char в соответствии с таблицей ascii; следовательно, эти 2 типа данных совместимы. Например это работает:

Обновл. 1 Дек 2019 |

В этом уроке мы рассмотрим целочисленные типы данных, их диапазоны значений, деление, а также переполнение: что это такое и примеры.

Целочисленные типы данных

Целочисленный тип данных — это тип, переменные которого могут содержать только целые числа (без дробной части, например: -2, -1, 0, 1, 2). В C++ есть пять основных целочисленных типов, доступных для использования:

Категория Тип Минимальный размер
Символьный тип данных char 1 байт
Целочисленный тип данных short 2 байта
int 2 байта (но чаще всего 4 байта)
long 4 байта
long long 8 байт

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

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

Определение целочисленных переменных

Происходит следующим образом:

В то время как полные названия short int , long int и long long int могут использоваться, их сокращённые версии (без int ) более предпочтительны для использования. К тому же постоянное добавление int затрудняет чтение кода (легко спутать с переменной).

Читайте также:  Как убрать подчеркивание в экселе

Диапазоны значений и знак целочисленных типов данных

Как вы уже знаете из предыдущего урока, переменная с n-ным количеством бит может хранить 2 n возможных значений. Но что это за значения? Те, которые находятся в диапазоне. Диапазон — это значения от и до, которые может хранить определённый тип данных. Диапазон целочисленной переменной определяется двумя факторами: её размером (в битах) и её знаком (который может быть signed или unsigned).

Целочисленный тип signed (со знаком) означает, что переменная может содержать как положительные, так и отрицательные числа. Чтобы объявить переменную как signed, используйте ключевое слово signed :

По умолчанию, ключевое слово signed пишется перед типом данных.

1-байтовая целочисленная переменная со знаком (signed) имеет диапазон значений от -128 до 127. Любое значение от -128 до 127 (включительно) может храниться в ней безопасно.

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

Целочисленный тип unsigned (без знака) может содержать только положительные числа. Чтобы объявить переменную как unsigned, используйте ключевое слово unsigned :

1-байтовая целочисленная переменная без знака (unsigned) имеет диапазон значений от 0 до 255.

Обратите внимание, объявление переменной как unsigned означает, что она не сможет содержать отрицательные числа (только положительные).

Теперь, когда вы поняли разницу между signed и unsigned, давайте рассмотрим диапазоны значений разных типов данных:

Размер/Тип Диапазон значений
1 байт signed от -128 до 127
1 байт unsigned от 0 до 255
2 байта signed от -32 768 до 32 767
2 байта unsigned от 0 до 65 535
4 байта signed от -2 147 483 648 до 2 147 483 647
4 байта unsigned от 0 до 4 294 967 295
8 байтов signed от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807
8 байтов unsigned от 0 до 18 446 744 073 709 551 615

Для математиков: переменная signed с n-ным количеством бит имеет диапазон от -(2 n-1 ) до 2 n-1 -1. Переменная unsigned с n-ным количеством бит имеет диапазон от 0 до (2 n )-1. Для нематематиков: используем таблицу 🙂

Начинающие программисты иногда путаются между signed и unsigned переменными. Но есть простой способ запомнить их различия. Чем отличается отрицательное число от положительного? Правильно! Минусом спереди. Если минуса нет, значит число — положительное. Следовательно, целочисленный тип со знаком (signed) означает, что минус может присутствовать, т.е. числа могут быть как положительными, так и отрицательными. Целочисленный тип без знака (unsigned) означает, что минус спереди полностью отсутствует, т.е. числа могут быть только положительными.

Что используется по умолчанию: signed или unsigned?

Так что же произойдёт, если мы объявим переменную без указания signed или unsigned?

Категория Тип По умолчанию
Символьный тип данных char signed или unsigned (в большинстве случаев signed)
Целочисленный тип данных short signed
int signed
long signed
long long signed

Все целочисленные типы данных, кроме char, являются signed по умолчанию. Тип char может быть как signed, так и unsigned (но, обычно, signed).

В большинстве случаев ключевое слово signed не пишется (оно и так используется по умолчанию), за исключением типа char (здесь лучше уточнить).

Читайте также:  Как сделать одну галочку в ватсапе

Программисты, как правило, избегают использования целочисленных типов unsigned, если в этом нет особой надобности, так как с переменными unsigned ошибок, по статистике, возникает больше, нежели с переменными signed.

Правило: Используйте целочисленные типы signed, вместо unsigned.

Переполнение

Вопрос: «Что произойдёт, если мы попытаемся использовать значение, которое находится вне диапазона значений определённого типа данных?». Ответ: «Переполнение».

Переполнение (англ. «overflow») случается при потере бит из-за того, что переменной не было выделено достаточно памяти для их хранения.

В уроке №28 мы говорили о том, что данные хранятся в бинарном (двоичном) формате и каждый бит может иметь только 2 возможных значения ( 0 или 1 ). Вот как выглядит диапазон чисел от 0 до 15 в десятичной и двоичной системах:

Десятичная система Двоичная система
1 1
2 10
3 11
4 100
5 101
6 110
7 111
8 1000
9 1001
10 1010
11 1011
12 1100
13 1101
14 1110
15 1111

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

Примеры переполнения

Рассмотрим переменную unsigned, которая состоит из 4 битов. Любое из двоичных чисел, перечисленных в таблице выше, поместиться внутри этой переменной.

«Но что произойдёт, если мы попытаемся присвоить значение, которое занимает больше 4 битов?». Правильно! Переполнение. Наша переменная будет хранить только 4 наименее значимых (те, что справа) бита, все остальные — потеряются.

Например, если мы попытаемся поместить число 21 в нашу 4-битную переменную:

Десятичная система Двоичная система
21 10101

Число 21 занимает 5 бит (10101). 4 бита справа (0101) поместятся в переменную, а крайний левый бит (1) просто потеряется. Т.е. наша переменная будет содержать 0101, что равно 101 (нуль спереди не считается), а это уже число 5, а не 21.

Примечание: О конвертации чисел из двоичной системы в десятичную и наоборот будет отдельный урок, где мы всё детально рассмотрим и обсудим.

Теперь рассмотрим пример в коде (тип short занимает 16 бит):

Особенностями работы с целыми числами в ЭВМ являются ограничения, накладываемые на значения из-за фиксированного размера памяти, выделяемой переменным. Следует учитывать три особенности при вычислениях с целочисленными данными:

1. В ЭВМ существуют команды арифметики для данных только одинакового типа и размера. (Если операнды разного типа, и один из них может быть приведен к типу второго без потери точности, перед выполнением операции автоматически будет выполнено приведение.)

2. Тип результата совпадает с типом операндов (кроме вещественного деления целых чисел). Если результат не помещается в отведенное место, старшие разряды теряются. Таким образом, множество целых чисел в ЭВМ представляет собой замкнутое кольцо – за самым большим значением следует самое малое.

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

В Turbo Pascal предусмотрено 5 разных стандартных описаний целых чисел, в зависимости от возможных диапазонов их изменения (соответственно выделяемой на числовое значение места в оперативной памяти). Их характеристики приведены в таблице.

Таблица 1. Описатели переменных целочисленных типов.

Ссылка на основную публикацию
Что означает значок лупа в телефоне самсунг
В Samsung galaxy S8 есть полезная функция для слабовидящих людей. Называется она экранная лупа. С ее помощью можно увеличивать отдельные...
Что делать если амино выдает ошибку
Все больше людей предпочитают проводить время за любимыми соцсетями. Лидерами с многомиллионной аудиторией продолжают оставаться: Вконтакте, Инстаграм, Одноклассники, Twitter, Faceebok...
Что значит импортировать изображения и видео
Администратор 26 Июнь 2017 Просмотров: 6241 Сегодня многие делают фотографические снимки на телефон – это быстро, удобно, к тому же...
Что перечисляется в секции references
GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software...
Adblock detector