Что значит размер int

Целый тип char занимает в памяти 1 байт (8 бит) и позволяет выразить в двоичной системе счисления 2^8 значений=256. Тип char может содержать как положительные, так и отрицательные значения. Диапазон изменения значений составляет от -128 до 127.

uchar

Целый тип uchar также занимает в памяти 1 байт, как и тип char, но в отличие от него, uchar предназначен только для положительных значений. Минимальное значение равно нулю, максимальное значение равно 255. Первая буква u в названии типа uchar является сокращением слова unsigned (беззнаковый).

short

Целый тип short имеет размер 2 байта(16 бит) и, соответственно, позволяет выразить множество значений равное 2 в степени 16: 2^16=65 536. Так как тип short является знаковым и содержит как положительные, так и отрицательные значения, то диапазон значений находится между -32 768 и 32 767.

ushort

Беззнаковым типом short является тип ushort, который также имеет размер 2 байта. Минимальное значение равно 0, максимальное значение 65 535.

Целый тип int имеет размер 4 байта (32 бита). Минимальное значение -2 147 483 648, максимальное значение 2 147 483 647.

Беззнаковый целый тип uint занимает в памяти 4 байта и позволяет выражать целочисленные значения от 0 до 4 294 967 295.

Целый тип long имеет размер 8 байт (64 бита). Минимальное значение -9 223 372 036 854 775 808, максимальное значение 9 223 372 036 854 775 807.

ulong

Целый тип ulong также занимает 8 байт и позволяет хранить значения от 0 до 18 446 744 073 709 551 615.

char ch= 12 ;
short sh=- 5000 ;
int in= 2445777 ;

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

//— бесконечный цикл
void OnStart ()
<
uchar u_ch;

for ( char ch=-128;ch
<
u_ch=ch;
Print ( «ch = » ,ch, » u_ch = » ,u_ch);
>
>

Правильно будет так:

//— правильный вариант
void OnStart ()
<
uchar u_ch;

for ( char ch=-128;ch
<
u_ch=ch;
Print ( «ch = » ,ch, » u_ch = » ,u_ch);
if (ch==127) break ;
>
>

ch= -128 u_ch= 128
ch= -127 u_ch= 129
ch= -126 u_ch= 130
ch= -125 u_ch= 131
ch= -124 u_ch= 132
ch= -123 u_ch= 133
ch= -122 u_ch= 134
ch= -121 u_ch= 135
ch= -120 u_ch= 136
ch= -119 u_ch= 137
ch= -118 u_ch= 138
ch= -117 u_ch= 139
ch= -116 u_ch= 140
ch= -115 u_ch= 141
ch= -114 u_ch= 142
ch= -113 u_ch= 143
ch= -112 u_ch= 144
ch= -111 u_ch= 145
.

//— отрицательные значения нельзя хранить в беззнаковых типах
uchar u_ch=-120;
ushort u_sh=-5000;
uint u_in=-401280;

Шестнадцатеричные: цифры 0-9, буквы а-f или А-F для значений 10-15; начинаются с 0х или 0Х.

0x0A , 0x12 , 0X12 , 0x2f , 0xA3 , 0Xa3 , 0X7C7

Компиляторы C++ Microsoft 32-bit и 64-bit распознают типы в таблице далее в этой статье. The Microsoft C++ 32-bit and 64-bit compilers recognize the types in the table later in this article.

int ( unsigned int ) int ( unsigned int )

__int8 ( unsigned __int8 ) __int8 ( unsigned __int8 )

__int16 ( unsigned __int16 ) __int16 ( unsigned __int16 )

__int32 ( unsigned __int32 ) __int32 ( unsigned __int32 )

__int64 ( unsigned __int64 ) __int64 ( unsigned __int64 )

short ( unsigned short ) short ( unsigned short )

long ( unsigned long ) long ( unsigned long )

long long ( unsigned long long ) long long ( unsigned long long )

Если имя начинается с двух символов подчеркивания ( __ ), тип данных является нестандартным. If its name begins with two underscores ( __ ), a data type is non-standard.

Читайте также:  Почему трещит индукционная варочная панель

Диапазоны, представленные в следующей таблице, включают указанные значения. The ranges that are specified in the following table are inclusive-inclusive.

Имя типа Type NameБайт BytesДругие имена Other NamesДиапазон значений Range of Valuesint int 4 4signed signed От -2 147 483 648 до 2 147 483 647 -2,147,483,648 to 2,147,483,647unsigned int unsigned int 4 4unsigned unsigned От 0 до 4 294 967 295 0 to 4,294,967,295__int8 __int8 1 1char char От -128 до 127 -128 to 127неподписанный __int8 unsigned __int8 1 1unsigned char unsigned char От 0 до 255 0 to 255__int16 __int16 2 2Short, короткое целое, короткое целое число со знаком short, short int, signed short int От -32 768 до 32 767 -32,768 to 32,767неподписанный __int16 unsigned __int16 2 2короткое число без знака, короткое целое без знака unsigned short, unsigned short int От 0 до 65 535 0 to 65,535__int32 __int32 4 4со знаком, целое число со знаком, целое число signed, signed int, int От -2 147 483 648 до 2 147 483 647 -2,147,483,648 to 2,147,483,647неподписанный __int32 unsigned __int32 4 4Неподписанное целое число без знака unsigned, unsigned int От 0 до 4 294 967 295 0 to 4,294,967,295__int64 __int64 8 8длинный длинный знак Long long long, signed long long От -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807unsigned __int64 unsigned __int64 8 8длинное целое без знака unsigned long long От 0 до 18 446 744 073 709 551 615 0 to 18,446,744,073,709,551,615bool bool 1 1Нет nonefalse или true false or true char char 1 1Нет noneот-128 до 127 по умолчанию -128 to 127 by default

При компиляции при помощи /J — от 0 до 255 0 to 255 when compiled by using /J

знак со знаком signed char 1 1Нет noneОт -128 до 127 -128 to 127unsigned char unsigned char 1 1Нет noneОт 0 до 255 0 to 255short short 2 2короткое целое, короткое целое со знаком short int, signed short int От -32 768 до 32 767 -32,768 to 32,767unsigned short unsigned short 2 2unsigned short int unsigned short int От 0 до 65 535 0 to 65,535long long 4 4long int, длинное целое число со знаком long int, signed long int От -2 147 483 648 до 2 147 483 647 -2,147,483,648 to 2,147,483,647unsigned long unsigned long 4 4unsigned long int unsigned long int От 0 до 4 294 967 295 0 to 4,294,967,295long long long long 8 8нет (но эквивалентно __int64) none (but equivalent to __int64)От -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807длинное целое без знака unsigned long long 8 8нет (но эквивалентно неподписанному __int64) none (but equivalent to unsigned __int64)От 0 до 18 446 744 073 709 551 615 0 to 18,446,744,073,709,551,615enum enum Возможны разные варианты variesНет nonefloat float 4 4Нет none3,4E +/- 38 (7 знаков) 3.4E +/- 38 (7 digits)double double 8 8Нет none1,7E +/- 308 (15 знаков) 1.7E +/- 308 (15 digits)long double long double то же, что и Double same as double Нет noneТо же, что и Double Same as double wchar_t wchar_t 2 2__wchar_t __wchar_t От 0 до 65 535 0 to 65,535Читайте также:  Почему плохо показывает фильм

В зависимости от того, как он используется, переменная __wchar_t обозначает либо тип расширенных символов, либо многобайтовый символ. Depending on how it’s used, a variable of __wchar_t designates either a wide-character type or multibyte-character type. Чтобы указать константу расширенного символьного типа, перед символьной или строковой константой следует использовать префикс L . Use the L prefix before a character or string constant to designate the wide-character-type constant.

знаки со знаком и без знака — это модификаторы, которые можно использовать с любым целочисленным типом, кроме bool. signed and unsigned are modifiers that you can use with any integral type except bool. Обратите внимание , что char, знак charи неподписанный символ — это три различных типа для таких механизмов, как перегрузка и шаблоны. Note that char, signed char, and unsigned char are three distinct types for the purposes of mechanisms like overloading and templates.

Целочисленные и неподписанные типы int имеют размер четыре байта. The int and unsigned int types have a size of four bytes. Однако переносимый код не должен зависеть от размера int , так как языковой стандарт позволяет реализовать его в зависимости от реализации. However, portable code should not depend on the size of int because the language standard allows this to be implementation-specific.

C и C++ в Visual Studio также поддерживают целочисленные типы с указанием размера. C/C++ in Visual Studio also supports sized integer types. Дополнительные сведения см. в разделах __int8, __int16, __int32, __int64 и Пределы целых чисел. For more information, see __int8, __int16, __int32, __int64 and Integer Limits.

Дополнительные сведения об ограничениях размеров каждого типа см. в разделе Встроенные типы. For more information about the restrictions of the sizes of each type, see Built-in types.

Диапазон перечисляемых типов зависит от контекста языка и указанных флажков компилятора. The range of enumerated types varies depending on the language context and specified compiler flags. Дополнительные сведения см. в статьях Объявления перечислений C и Объявления перечислений C++. For more information, see C Enumeration Declarations and Enumerations.

Для начала несколько вопросов:

  1. Тип char по умолчанию знаковый или нет? А int ?
  2. Законно ли неявное приведение (signed char *) к (char *) ? А то же для int ?
  3. Сколько бит в unsigned char ?
  4. Какое максимальное число гарантированно можно поместить в int ? А минимальное?
  5. Тип long определённо больше, чем char , не так ли?

Разумеется, экспериментально искать ответы на эти вопросы с помощью вашего любимого компилятора в вашей любимой системе на вашем любимом компьютере 1) — не лучшая идея. Мы говорим о стандарте языка (С99 и новее).

Если вы уверенно сможете правильно ответить на эти вопросы, тогда эта статья не для вас. В противном случае десять минут, потраченные на её чтение, будут весьма полезны.

  1. Знаковые оба.
  2. Законны оба.
  3. 8.
  4. 2147483647. -2147483648.
  5. Конечно, Кэп.

  1. char — не регламентируется, int — знаковый.
  2. Для int — законно, а для char — нет.
  3. Не менее 8.
  4. 32767. -32767
  5. Вообще говоря, нет.

Про signed и unsigned

Все целочисленные типы кроме char , по умолчанию знаковые (signed).

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

Читайте также:  Плей маркет просит промокод что делать

Хотя формально это три разных типа, но фактически char эквивалентен либо signed char , либо unsigned char — на выбор компилятора (стандарт ничего конкретного не требует).

Подробнее про char я написал в комментариях.

О размере unsigned char

Тип unsigned char является абстракцией машинного байта. Важность этого типа проявляется в том, что С может адресовать память только с точностью до байта. На большинстве архитектур размер байта равен 8 бит, но бывают и исключения. Например, процессоры с 36-битной архитектурой как правило имеют 9-битный байт, а в некоторых DSP от Texas Instruments байты состоят из 16 или 32 бит. Древние архитектуры могут иметь короткие байты из 4, 5 или 7 бит.

Стандарт С вынужден отказаться от допотопных архитектур и требует, чтобы байты были как минимум 8-битные. Конкретное значение ( CHAR_BIT 2) ) для данной платформы записано в заголовочном файле limits.h .

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

C переносимый, поэтому в нём базовые целочисленные типы ( char , short , int и др.) не имеют строго установленного размера, а зависят от платформы. Однако эти типы не были бы переносимы, если бы
их размеры были совершенно произвольные: стандарт устанавливает минимальные диапазоны принимаемых значений для всех базовых целочисленные типов. А именно,

  • signed char: -127. 127 (не -128. 127; аналогично другие типы)
  • unsigned char : 0. 255 (= 2 8 −1)
  • signed short : -32767. 32767
  • unsigned short : 0. 65535 (= 2 16 −1)
  • signed int : -32767. 32767
  • unsigned int : 0. 65535 (= 2 16 −1)
  • signed long : -2147483647. 2147483647
  • unsigned long : 0. 4294967295 (= 2 32 −1)
  • signed long long : -9223372036854775807. 9223372036854775807
  • unsigned long long : 0. 18446744073709551615 (= 2 64 −1)

Стандарт требует, чтобы максимальное значение unsigned char было 2 CHAR_BIT −1 (см. предыдущий пункт).

Стандарт требует sizeof(char) . Таким образом, вполне законны ситуации типа sizeof(char)=sizeof(long)=32 . Для некоторых DSP от Texas Instruments так и есть.

Конкретные значения этих диапазонов для данной платформы указаны заголовочном файле limits.h .

Новые типы в С99

После того, как C99 добавил тип long long , целочисленных типов и путаницы стало ещё больше. Чтобы навести порядок, стандарт ввёл заголовочный файл stdint.h , где определяются типы вроде int16_t (равно 16 бит), int_least16_t (минимальный тип, способный вместить 16 бит), int_fast16_t (по крайней мере 16 бит, работа с этим типом наиболее быстрая на данной платформе) и т. п.

least- и fast-типы фактически являются заменой рассмотренных выше типов int , short , long и т. п. только вдобавок дают программисту возможность выбора между скоростью и размером.

От типов вроде int16_t , со строгим указанием размера, страдает переносимость: скажем, на архитектуре с 9-битным байтом может просто не найтись 16-битного регистра. Поэтому стандарт тут явно говорит, что эти типы опциональны. Но учитывая, что какой бы код вы ни писали, чуть менее чем во всех случаях целевая архитектура фиксирована даже в худшем случае с точностью до семейства (скажем, x86 или AVR), внутри которого, размер байта не может вдруг поменяться, то переносимость фактически сохраняется. Более того, типы вроде int16_t оказались даже более популярными, чем int_least16_t и int_fast16_t , а при низкоуровневом программировании (микроконтроллеры, драйверы устройств) и подавно, ибо там зачастую неопределённость размера переменной просто непозволительна.

1) Для удобства тройку архитектура+ОС+компилятор далее будем называть просто платформой.
2) Этот макрос правильнее было бы назвать UCHAR_BIT , но по причинам совместимости он называется так, как называется.

No related posts.

9726552