Short int c: В чем разница между «short int» и «int» в C?

В чем разница между «short int» и «int» в C?

Чем отличаются short int (или short) и int в C? Они имеют одинаковый размер и диапазон. Если они по существу одинаковы, то какой смысл иметь два типа данных?

c

types

Поделиться

Источник


Kanwaljeet Singh    

05 сентября 2012 в 10:08

9 ответов


  • В чем разница между(int) sizeof (void *) и int?

    Я всего лишь новичок в программировании C. Могу я задать простой вопрос ? В чем разница между (int) sizeof(void *) и int ? экс) #define ptrint int #define PTRINT ((int) sizeof(void *))

  • В чем разница между short и SHORT в c++?

    В чем разница между short и SHORT в c++? Один тип данных — это все строчные буквы, а другой-все заглавные. Есть ли разница? Кажется, я понял. Итак, SHORT-это что-то вроде класса в Java?



26

Они могут иметь одинаковый размер, но гарантируется, что int равно или больше short int .

Поделиться


MByD    

05 сентября 2012 в 10:10



24

Теоретически, по стандарту C, они могут быть любого размера до short <= int .

В реальном мире именно так реализуются размеры.

CPU             short   int
8 bit           16      16
16 bit          16      16
32 bit          16      32
64 bit          16      32

Поделиться


Lundin    

05 сентября 2012 в 11:17



4

Никогда не полагайтесь на то, что тип данных имеет заданный размер в C. Всегда проверяйте границы в limits.h, если сомневаетесь.

Поделиться


Robbie Dee    

05 сентября 2012 в 10:15


  • разница между unsigned short int и unsigned short

    Есть ли разница между unsigned short int и unsigned short decleration в c, и если да, то в чем она, пожалуйста ? Я попытался поискать в интернете, но не смог найти ничего стоящего. unsigned short int x1; unsigned short x2; Наконец, если есть разница, как я могу бросить их друг другу…

  • в чем разница между int и cl_int в OpenCL?

    В OpenCL есть много типов данных, таких как int , cl_int , char , cl_char , ‘short’, ‘cl_short’. Но в чем разница между int и cl_int , и когда я должен использовать cl_int вместо int ?



2

С99 N1256 типовой проект

Все, что мы сейчас точно знаем, это то, что:

2 <= sizeof(short) <= sizeof(int)

5.2.4.2.1 размеры целочисленных типов <limits.h> дает минимальные размеры:

1 […] их определенные реализацией значения должны быть равны или больше по величине (абсолютной величине) показанным […]

  • UCHAR_MAX 255 // 2 8 − 1
  • USHRT_MAX 65535 // 2 16 − 1
  • UINT_MAX 65535 // 2 16 − 1
  • ULONG_MAX 4294967295 // 2 32 − 1
  • ULLONG_MAX 18446744073709551615 // 2 64 − 1

6. 2.5 тип затем говорит:

8 для любых двух целочисленных типов с одинаковым знаком и разным рангом целочисленного преобразования
(см. 6.3.1.1) диапазон значений типа с меньшим рангом целочисленного преобразования является
поддиапазоном значений другого типа.

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

1 Каждый целочисленный тип имеет ранг целочисленного преобразования, определяемый следующим образом:

  • Звание длинный интервал должен быть больше, чем ранг длинные int, который
    должен быть больше ранга int, который должен быть больше ранга short
    int, который должен быть больше ранга signed char.
  • Ранг любого целочисленного типа без знака должен равняться рангу соответствующего
    целочисленного типа со знаком, если таковой имеется.
  • Для всех целочисленных типов T1, T2 и T3, если T1 имеет больший ранг, чем T2, а T2 имеет
    больший ранг, чем T3, то T1 имеет больший ранг, чем T3

Поделиться


Ciro Santilli 郝海东冠状病六四事件法轮功    

09 мая 2016 в 19:47



1

Это зависит от системы. Некоторые OSes не будут иметь одинаковой длины для обоих типов.

Поделиться


YoyoS    

05 сентября 2012 в 10:11



0

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

короткое <= инт <= долго

Поделиться


Bharat Sharma    

05 сентября 2012 в 10:35



0

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

Источник

Поделиться


Ljdawson    

05 сентября 2012 в 10:11



0

Сегодня я работал над тем же. Мой вывод заключается в том, что это зависит от длины слова архитектуры машины, на которой выполняется ваша программа.
Согласно документации C99 limits.h.

/* Minimum and maximum values a `signed short int' can hold.  */
#  define SHRT_MIN  (-32768)
#  define SHRT_MAX  32767

/* Maximum value an `unsigned short int' can hold.  (Minimum is 0.)  */
#  define USHRT_MAX 65535

/* Minimum and maximum values a `signed int' can hold.  */
#  define INT_MIN   (-INT_MAX - 1)
#  define INT_MAX   2147483647

/* Maximum value an `unsigned int' can hold.  (Minimum is 0.)  */
#  define UINT_MAX  4294967295U

/* Minimum and maximum values a `signed long int' can hold.  */
#  if __WORDSIZE == 64
#   define LONG_MAX 9223372036854775807L
#  else
#   define LONG_MAX 2147483647L
#  endif
#  define LONG_MIN  (-LONG_MAX - 1L)

/* Maximum value an `unsigned long int' can hold.  (Minimum is 0.)  */
#  if __WORDSIZE == 64
#   define ULONG_MAX    18446744073709551615UL
#  else
#   define ULONG_MAX    4294967295UL
#  endif

Дайте мне знать, если у кого-нибудь есть лучший ответ.

Поделиться


Mateen Maldar    

28 июня 2017 в 04:08



0

short и int должны быть не менее 16 бит, long должны быть не менее 32 бит, и этот short не длиннее int, который не длиннее long. Как правило, short — это 16 бит, long-32 бита, а int-16 или 32 бита.

Поделиться


Ajitesh Sinha    

27 июля 2018 в 10:12


Похожие вопросы:

В чем разница между int[][] и int[,]?

Возможный Дубликат : В чем разница между использованием int[][] и int[,]? Я только что наткнулся на эту нотацию: int[,] Всякий раз, когда мне нужна была матрица, я использовал: int[][] В чем же…

в чем разница между short signed int и signed int

Я ссылался на учебник по c,я обнаружил, что signed int & short signed int range-это от -32768 до 32767, и это 2 байта, есть ли у них какая-то разница, если нет, то почему используются два вида. ..

В чем разница между типами int** и int[][]?

Если допустимо следующее назначение: int a[2] = {1,2}; int* b = a; тогда что же в этом плохого: int a[2][2]={1,2,3,4}; int** b = a; C++ выдает ошибку, что он не может преобразовать int[][] в int** ….

В чем разница между(int) sizeof (void *) и int?

Я всего лишь новичок в программировании C. Могу я задать простой вопрос ? В чем разница между (int) sizeof(void *) и int ? экс) #define ptrint int #define PTRINT ((int) sizeof(void *))

В чем разница между short и SHORT в c++?

В чем разница между short и SHORT в c++? Один тип данных — это все строчные буквы, а другой-все заглавные. Есть ли разница? Кажется, я понял. Итак, SHORT-это что-то вроде класса в Java?

разница между unsigned short int и unsigned short

Есть ли разница между unsigned short int и unsigned short decleration в c, и если да, то в чем она, пожалуйста ? Я попытался поискать в интернете, но не смог найти ничего стоящего. unsigned short…

в чем разница между int и cl_int в OpenCL?

В OpenCL есть много типов данных, таких как int , cl_int , char , cl_char , ‘short’, ‘cl_short’. Но в чем разница между int и cl_int , и когда я должен использовать cl_int вместо int ?

В чем разница между «short int» и «short» в c?

в чем разница между объявлением переменных как short int и short? В компиляторе gcc short занимает 2 байта(проверено с помощью sizeof (short)),а short int также дает 2 байта размера. Разве оба они…

В чем разница между unsigned short int и unsigned int или unsigned short?

По данным: http://en.wikipedia.org/wiki/ C_data_types можно использовать беззнаковый тип short или unsigned короткие тип int. Но какая между ними разница? Я знаю, что это беззнаковый Short и я знаю,…

В чем разница между int *[5] и int (*)[5] в C?

Я пытаюсь понять разницу между int *[5] и int (*)[5] , и мой простой код выглядит следующим образом. int main() { int a[5] = {10,11,12,13,14}; int *ptr[5]; ptr = &a; } В чем разница между int…

Встроенные типы (C++) | Microsoft Docs



  • Чтение занимает 2 мин

В этой статье

Встроенные типы (также называемые фундаментальными типами) задаются стандартом языка C++ и встроены в компилятор. Встроенные типы не определены в файле заголовка. Встроенные типы делятся на три основные категории: целые, с плавающей запятой и void. Целочисленные типы представляют целые числа. Типы с плавающей запятой могут указывать значения, которые могут содержать дробные части. Большинство встроенных типов рассматриваются компилятором как отдельные типы. Однако некоторые типы являются синонимами или обрабатываются компилятором как эквивалентные типы.

Тип void

voidТип описывает пустой набор значений. Невозможно указать переменную типа void . void Тип используется в основном для объявления функций, которые не возвращают значения, или для объявления универсальных указателей на нетипизированные или произвольные типизированные данные. Любое выражение может быть явно преобразовано или приведено к типу void . Однако такие выражения можно использовать только в следующих операторах и операндах:

std:: nullptr_t

Ключевое слово nullptr является константой указателя NULL типа std::nullptr_t , которая преобразуется в любой Необработанный тип указателя. Дополнительные сведения см. на веб-сайте nullptr.

Логический тип

boolТип может иметь значения true и false . Размер bool типа зависит от конкретной реализации. См. раздел размеры встроенных типов для деталей реализации, связанных с Майкрософт.

Символьные типы

char Тип является типом символьного представления, который эффективно кодирует члены базовой кодировки выполнения. Компилятор C++ обрабатывает переменные типа char , и, signed char unsigned char в отличие от разных типов.

Зависящие от Майкрософт: переменные типа char помещаются в int тип по signed char умолчанию, если не /J используется параметр компиляции. В этом случае они рассматриваются как тип unsigned char и переносятся в int без расширения знака.

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

Для конкретного Майкрософт: по умолчанию wchar_t является собственным типом, но можно использовать /Zc:wchar_t- для создания определения типа wchar_t для unsigned short . __wchar_t Тип является синонимом для собственного типа, характерным для Microsoft wchar_t .

char8_t Тип используется для символьного представления UTF-8. Он имеет то же представление unsigned char , что и, но обрабатывается компилятором как отдельный тип. char8_t Тип является новым в c++ 20. Для Майкрософт: для использования char8_t требуется /std:c++latest параметр компилятора.

char16_t Тип используется для символьного представления UTF-16. Он должен быть достаточно большим, чтобы представлять любой блок кода UTF-16. Компилятор обрабатывает его как отдельный тип.

char32_t Тип используется для символьного представления UTF-32. Он должен быть достаточно большим, чтобы представлять любую единицу кода UTF-32. Компилятор обрабатывает его как отдельный тип.

Типы с плавающей запятой

Типы с плавающей запятой используют представление IEEE-754, чтобы обеспечить приближение дробных значений к широкому диапазону величин. В следующей таблице перечислены типы с плавающей запятой в C++ и сравнительные ограничения размеров типов с плавающей запятой. Эти ограничения задаются стандартом C++ и не зависят от реализации Майкрософт. Абсолютный размер встроенных типов с плавающей запятой не указан в стандарте.

ТипСодержимое
floatТип float — это наименьший тип с плавающей запятой в C++.
doubleТип double — это тип с плавающей запятой, который больше или равен типу float , но меньше или равен размеру типа long double .
long doubleТип long double — это тип с плавающей запятой, который больше или равен типу double .

Конкретно для Майкрософт: представление long double и double идентично. Однако long double double компилятор обрабатывает как отдельные типы. Компилятор Microsoft C++ использует 4-и 8-байтовые представления с плавающей запятой в формате IEEE-754. Дополнительные сведения см. в разделе IEEE с плавающей точкой.

Целочисленные типы

int Тип является базовым целочисленным типом по умолчанию. Он может представлять все целые числа в диапазоне, зависящем от реализации.

Представление целого числа со знаком — это одно из значений, которое может содержать положительные и отрицательные значения. Он используется по умолчанию или при signed наличии ключевого слова модификатор. unsigned Ключевое слово модификатор задает Неподписанное представление, которое может содержать только неотрицательные значения.

Модификатор размера задает ширину в битах используемого представления целых чисел. Язык поддерживает short long модификаторы, и long long . short Тип должен быть не менее 16 бит в ширину. long Тип должен быть не менее 32 бит в ширину. long long Тип должен быть не менее 64 бит в ширину. Стандартный задает отношение размера между целыми типами:

1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)

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

int Ключевое слово можно опустить, если signed unsigned заданы модификаторы, или. Модификаторы и int тип, если они есть, могут использоваться в любом порядке. Например, short unsigned и unsigned int short следует ссылаться на один и тот же тип.

Синонимы целочисленного типа

Компилятор считает синонимами следующие группы типов:

  • short, short int, signed short, signed short int

  • unsigned short, unsigned short int

  • int, signed, signed int

  • unsigned, unsigned int

  • long, long int, signed long, signed long int

  • unsigned long, unsigned long int

  • long long, long long int, signed long long, signed long long int

  • unsigned long long, unsigned long long int

Целочисленные типы, определяемые корпорацией Майкрософт , включают в себя конкретные __int8 типы,, __int16 __int32 и __int64 . Эти типы могут использовать signed unsigned модификаторы и. Тип данных __int8 аналогичен типу char , __int16  — типу short , __int32  — типу int , а __int64  — типу long long .

Размеры встроенных типов

Большинство встроенных типов имеют размеры, определенные реализацией. В следующей таблице перечислены объемы хранилища, необходимые для встроенных типов в Microsoft C++. В частности, long имеет 4 байта даже в 64-разрядных операционных системах.

ТипРазмер
bool, char, char8_t, unsigned char, signed char, __int81 байт
char16_t, __int16, short, unsigned short, wchar_t, __wchar_t2 байта
char32_t, float, __int32, int, unsigned int, long, unsigned long4 байта
double, __int64, long double, long long, unsigned long long8 байт

Сведения о диапазоне значений каждого типа см. 64-1 18446744073709551615

Максимальное значение __int64: 9223372036854775807
Минимальное значение __int64: -9223372036854775808
Максимальное значение без знака __int64: 18446744073709551615

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

PS: верхний или нижний предел диапазона значений может быть реализован с помощью оператора сдвига влево (<<). Например:

Диапазон значений int может быть выражен как :-( 1 << 31) ~ ((1 << 31) -1)

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

типов — в чем разница между «short int» и «int» в C?

типов — в чем разница между «short int» и «int» в C? — Переполнение стека

Присоединяйтесь к Stack Overflow , чтобы учиться, делиться знаниями и строить свою карьеру.

Спросил

Просмотрено
82k раз

Чем отличается short int (или short) от int в C? У них одинаковый размер и ассортимент.Если они по сути одинаковы, какой смысл в двух типах данных?

Создан 05 сен.

Канвалджит Сингх

1,15544 золотых знака1313 серебряных знаков2525 бронзовых знаков

1

Они могут иметь одинакового размера, но гарантируется, что int больше или равно short int .

Создан 05 сен.

МБыДМБыД

2,112k2525 золотых знаков254254 серебряных знака264264 бронзовых знака

3

Теоретически / по стандарту C они могут быть любого размера, если 16 бит <= short <= int .

В реальном мире размеры реализованы так.

  ЦП короткий внутр.
8 бит 16 16
16 бит 16 16
32 бит 16 32
64 бит 16 32
  

Создан 05 сен.

Лундин

156k3434 золотых знака214214 серебряных знаков342342 бронзовых знака

6

Никогда не полагайтесь на тип данных заданного размера в C.Всегда проверяйте границы в limits.h, если сомневаетесь.

Создан 05 сен.

Робби ДиРобби Ди

1,77 серебряных знаков4343 бронзовых знака

2

C99 N1256 стандартная тяга

Все, в чем мы сейчас уверены, это то, что:

  2 <= sizeof (короткий) <= sizeof (int)
  

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

1 [...] Их определяемые реализацией значения должны быть равны или больше по величине (абсолютному значению) показанным [...]

  • UCHAR_MAX 255 // 2 8 - 1
  • USHRT_MAX 65535 // 2 16 - 1
  • UINT_MAX 65535 // 2 16 - 1
  • ULONG_MAX 4294967295 // 2 32 - 1
  • ULLONG_MAX 18446744073709551615 // 2 64 - 1

6.2.5 Типы затем говорят:

8 Для любых двух целочисленных типов с одинаковой подписью и разным рангом целочисленного преобразования
(см. 6.3.1.1), диапазон значений типа с меньшим целочисленным рангом преобразования равен
поддиапазон значений другого типа.

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

1 Каждый целочисленный тип имеет ранг целочисленного преобразования, определенный следующим образом:

  • Ранг long long int должен быть больше ранга long int, который
    должен быть выше ранга int, который должен быть выше ранга короткого
    int, который должен быть выше ранга подписанного char.
  • Ранг любого целочисленного типа без знака должен равняться рангу соответствующего
    знаковый целочисленный тип, если есть.
  • Для всех целочисленных типов T1, T2 и T3, если T1 имеет более высокий ранг, чем T2, а T2 имеет
    ранг выше, чем у T3, то у T1 есть ранг выше, чем у T3

Создан 09 мая 2016, в 22:47

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

Создан 05 сен.

Йойо

57011 золотой знак55 серебряных знаков1616 бронзовых знаков

На самом деле все зависит и от компилятора, и от системы.Но основное правило гласит, что int никогда не может быть меньше short и никогда не может быть больше long.

короткий <= int <= длинный

Создан 05 сен.

Бхарат ШармаБхарат Шарма

3,79611 золотых знаков1515 серебряных знаков2727 бронзовых знаков

1

Сегодня я работал над таким же.Мой вывод: это зависит от длины слова архитектуры машины, на которой выполняется ваша программа.
Согласно документации C99 limits.h.

  / * Минимальное и максимальное значения, которые может содержать `signed short int '. * /
# определить SHRT_MIN (-32768)
# определить SHRT_MAX 32767

/ * Максимальное значение, которое может содержать `unsigned short int '. (Минимум 0.) * /
# определить USHRT_MAX 65535

/ * Минимальное и максимальное значения, которые может содержать `signed int '. * /
# определить INT_MIN (-INT_MAX - 1)
# определить INT_MAX 2147483647

/ * Максимальное значение, которое может содержать `unsigned int '.(Минимум 0.) * /
# define UINT_MAX 4294967295U

/ * Минимальное и максимальное значения, которые может содержать `signed long int '. * /
# if __WORDSIZE == 64
# define LONG_MAX 9223372036854775807L
#  еще
# define LONG_MAX 2147483647L
# endif
# определить LONG_MIN (-LONG_MAX - 1L)

/ * Максимальное значение, которое может содержать `unsigned long int '. (Минимум 0.) * /
# if __WORDSIZE == 64
# define ULONG_MAX 18446744073709551615UL
#  еще
# define ULONG_MAX 4294967295UL
# endif
  

Дайте мне знать, если у кого-нибудь есть лучший ответ.

Создан 28 июн.

4

"Короткое целое число на одном языке программирования может иметь другой размер.
на другом языке или на другом процессоре. На некоторых языках
этот размер фиксирован для разных платформ, в то время как на других
машинно-зависимый.В некоторых языках этот тип данных не существует в
все »

Источник

Создан 05 сен.

Лждоусон

11.5k1111 золотых знаков4141 серебряный знак5858 бронзовых знаков

3

short и int должно быть не менее 16 бит, long должно быть не менее 32 бит, и это short не длиннее int, которое не длиннее long.Обычно short - 16 бит, long - 32 бита, а int - 16 или 32 бит.

Создан 27 июл.

Зависит от компилятора.
В некоторых компиляторах int составляет 2 байта, а в других компиляторах - 4 байта.

ответ дан 30 мая в 21:29

1

Не тот ответ, который вы ищете? Посмотрите другие вопросы с метками c типы или задайте свой вопрос.

язык-c

Stack Overflow лучше всего работает с включенным JavaScript

Ваша конфиденциальность

Нажимая «Принять все файлы cookie», вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в ​​отношении файлов cookie.

Принимать все файлы cookie

Настроить параметры

Что такое «короткий» тип данных в C?

короткий - короткий короткий int .Они синонимы. short , short int , signed short и signed short int - все это один и тот же тип данных. Точное количество битов в коротком коде зависит от компилятора и системы, но требуется как минимум 16 бит:

Любой компилятор, соответствующий Стандарту, должен также соблюдать следующие ограничения в отношении диапазона значений, который может принимать любой конкретный тип. Обратите внимание, что это более низкие пределы: реализация может превышать любое из них или все из них.Также обратите внимание, что минимальный диапазон для char зависит от того, считается ли char подписанным или беззнаковым. ... короткий int: от -32767 до +32767.

Ещё из Википедии:

Фактический размер целочисленных типов зависит от реализации. Единственная гарантия состоит в том, что long long не меньше long, что не меньше int, которое не меньше short. Кроме того, int должен быть целочисленным типом, с которым целевой процессор наиболее эффективно работает.Это обеспечивает большую гибкость: например, все типы могут быть 64-битными. Однако популярны только несколько схем целочисленной ширины (модели данных), и поскольку модель данных определяет способ взаимодействия различных программ, в интерфейсе приложения данной операционной системы используется единообразная модель данных [3].

На практике следует отметить, что char обычно имеет размер 8 бит, short обычно имеет размер 16 бит, а long обычно имеет размер 32 бита (аналогично unsigned char, unsigned short и unsigned long).Например, это справедливо для самых разных платформ, таких как Sun0S 4 Unix 1990-х годов, Microsoft MSDOS, современный Linux и Microchip MCC18 для встроенных 8-битных микроконтроллеров PIC.

Редактировать:

В LP64 (все 64-битные операционные системы, отличные от Windows): char - 8 бит, short - 16 бит, int - 32 бит, long - 64 бит, long long - 128 бит.

Windows сохраняет LLP64: char - 8 бит, short - 16 бит, int - 32 бит, long - 32 бит, long long - 64 бит.

Типы данных C ++ - GeeksforGeeks

Все переменные используют тип данных во время объявления, чтобы ограничить тип данных, которые должны быть сохранены.Следовательно, мы можем сказать, что типы данных используются, чтобы сообщить переменным, какой тип данных они могут хранить. Каждый раз, когда переменная определяется в C ++, компилятор выделяет для этой переменной некоторую память в зависимости от типа данных, с которым она объявлена. Для каждого типа данных требуется разный объем памяти.

Типы данных в C ++ в основном делятся на три типа:

  1. Примитивные типы данных : Эти типы данных являются встроенными или предопределенными типами данных и могут использоваться непосредственно пользователем для объявления переменных.пример: int, char, float, bool и т. д. В C ++ доступны следующие примитивные типы данных:
    • Целое число
    • Символ
    • Логическое значение
    • Плавающая точка
    • Двойная плавающая точка
    • Без значения или пустота
    • Широкий символ
  2. Производные типы данных: Типы данных, производные от примитивных или встроенных типов данных, называются производными типами данных. Они могут быть четырех типов, а именно:
    • Функция
    • Массив
    • Указатель
    • Ссылка
  3. Абстрактные или определяемые пользователем типы данных : Эти типы данных определяются самим пользователем.Например, определение класса на C ++ или структуры. C ++ предоставляет следующие определяемые пользователем типы данных:
    • Class
    • Structure
    • Union
    • Enumeration
    • Typedef defined DataType

В этой статье обсуждаются примитивных типов данных , доступных в C ++.

  • Целое число : ключевое слово, используемое для целочисленных типов данных, - int . Целые числа обычно требуют 4 байта памяти и находятся в диапазоне от -2147483648 до 2147483647.
  • Символ : Символьный тип данных используется для хранения символов. Ключевое слово, используемое для символьного типа данных - char . Символы обычно требуют 1 байт пространства памяти и находятся в диапазоне от -128 до 127 или от 0 до 255.
  • Boolean : Тип данных Boolean используется для хранения логических или логических значений. Логическая переменная может хранить либо true , либо false . Ключевое слово, используемое для логического типа данных, - bool .
  • Floating Point : Тип данных Floating Point используется для хранения значений с плавающей запятой одинарной точности или десятичных значений.Ключевое слово, используемое для типа данных с плавающей запятой, - float . Для переменных с плавающей запятой обычно требуется 4 байта памяти.
  • Double Floating Point : Тип данных Double Floating Point используется для хранения значений с плавающей запятой двойной точности или десятичных значений. Ключевое слово, используемое для типа данных с плавающей запятой, - double . Для переменных типа Double обычно требуется 8 байт памяти.
  • недействителен : Пустота означает отсутствие какого-либо значения. Тип данных void представляет собой бесполезную сущность.Тип данных Void используется для тех функций, которые не возвращают значение.
  • Wide Character : Тип данных Wide character также является символьным типом данных, но этот тип данных имеет размер больше, чем нормальный 8-битный тип данных. В лице wchar_t . Обычно это 2 или 4 байта.

Модификаторы типов данных

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

Модификаторы типов данных, доступные в C ++:

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

без знака

двойной 8

Тип данных Размер (в байтах) Диапазон
короткий int 2 -32,768 до 32,767
беззнаковый короткий int 2 0 до 65,535
без знака 467,949 int 4 -2 147 483 648 до 2 147 483 647
длинное int 4 -2 147 483 648 до 2 147 483 647
длинное целое

длинное

8 - от (2 ^ 63) до (2 ^ 63) -1
беззнаковый длинный длинный int 8 от 0 до 18,446,744,073,709,551,615
знаковый символ 1-128 до 127
беззнаковый символ 1 0 до 255
длинный двойной 12
wchar_t 2 или 4 1 широкий символ

компилятор Примечание : значения могут отличаться от компилятора.В приведенном выше примере мы рассмотрели 32-битный GCC.
Мы можем отобразить размер всех типов данных, используя оператор sizeof () и передав ключевое слово типа данных в качестве аргумента этой функции, как показано ниже:

CPP

#include

с использованием пространства имен std;

int main ()

{

cout << "Размер графа:" << sizeof ( char )

<< "байт" << endl;

cout << "Размер int:" << sizeof ( int )

<< "байтов» << endl;

cout << "Размер короткого int:" << sizeof ( короткий int )

<< "байтов» << endl;

cout << "Размер длинного int:" << sizeof ( long int )

<< "байтов» << endl;

cout << "Размер подписанного long int:" << sizeof ( подписанный long int )

<< «байт» << endl;

cout << "Размер беззнакового long int:" << sizeof (без знака long int )

<< " bytes " << endl;

cout << "Размер поплавка:" << sizeof ( float )

<< "байтов" << endl;

cout << "Размер двойника:" << sizeof ( двойной )

<< "байтов» << endl;

cout << "Размер wchar_t:" << sizeof ( wchar_t )

<< "байтов" << endl;

возврат 0;

}

Выход:

 Размер символа: 1 байт
Размер int: 4 байта
Размер короткого int: 2 байта
Размер long int: 8 байт
Размер длинного целого числа со знаком: 8 байт
Размер беззнакового длинного целого числа: 8 байтов
Размер числа с плавающей запятой: 4 байта
Размер двойного: 8 байт
Размер wchar_t: 4 байта 

Эту статью предоставил Harsh Agarwal .Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью с помощью provide.geeksforgeeks.org или отправить ее по электронной почте на [email protected]. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.
Пожалуйста, напишите комментарий, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.

Вниманию читателя! Не прекращайте учиться сейчас. Освойте все важные концепции DSA с помощью курса DSA Self Paced Course по доступной для студентов цене и подготовьтесь к работе в отрасли.Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Complete Interview Preparation Course .

Если вы хотите посещать живые занятия с отраслевыми экспертами, обратитесь к Классы компьютерных фанатов в прямом эфире

Диапазоны типов данных | Документы Microsoft

  • 2 минуты на чтение

В этой статье

32-разрядные и 64-разрядные компиляторы Microsoft C ++ распознают типы, указанные в таблице далее в этой статье.

  • int ( без знака int )

  • __int8 ( без знака __int8 )

  • __int16 ( без знака __int16 )

  • __int32 ( без знака __int32 )

  • __int64 ( без знака __int64 )

  • короткий ( беззнаковый короткий )

  • длинный ( беззнаковый длинный )

  • длинный длинный ( беззнаковый длинный длинный )

Если его имя начинается с двух знаков подчеркивания ( __ ), тип данных нестандартный.

Диапазоны, указанные в следующей таблице, включают включительно.

Тип Название байтов Другие имена Диапазон значений
внутренний 4 подписано -2 147 483 648 до 2 147 483 647
целое без знака 4 без знака 0 до 4 294 967 295
__int8 1 символ -128 до 127
без знака __int8 1 символ без знака от 0 до 255
__int16 2 короткий , короткий int , подписанный короткий int -32 768 до 32 767
без знака __int16 2 беззнаковый короткий , беззнаковый короткий int 0 до 65 535
__int32 4 подписано , подписано int , int -2 147 483 648 до 2 147 483 647
без знака __int32 4 без знака , без знака int 0 до 4 294 967 295
__int64 8 длинный длинный , подписанный длинный длинный -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807
без знака __int64 8 беззнаковый длинный длинный 0 до 18 446 744 073 709 551 615
булев 1 нет ложно или истинно
символ 1 нет от -128 до 127 по умолчанию

от 0 до 255 при компиляции с использованием / J

символ со знаком 1 нет -128 до 127
символ без знака 1 нет от 0 до 255
короткий 2 короткий int , подписанный короткий int -32 768 до 32 767
короткое без знака 2 беззнаковое короткое целое 0 до 65 535
длинный 4 длинный int , подписанный длинный int -2 147 483 648 до 2 147 483 647
длинный без знака 4 беззнаковое длинное целое 0 до 4 294 967 295
длинный длинный 8 нет (но эквивалентно __int64 ) -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807
беззнаковый длинный длинный 8 нет (но эквивалентно беззнаковый __int64 ) 0 до 18 446 744 073 709 551 615
перечисление варьируется нет
поплавок 4 нет 3.4E +/- 38 (7 цифр)
двойной 8 нет 1.7E +/- 308 (15 цифр)
длинный двойной как двойной нет То же, что двойной
wchar_t 2 __wchar_t 0 до 65 535

В зависимости от того, как она используется, переменная __wchar_t обозначает либо тип расширенных символов, либо тип многобайтовых символов.Используйте префикс L перед символьной или строковой константой для обозначения константы типа расширенных символов.

signed и unsigned - это модификаторы, которые можно использовать с любым целочисленным типом, кроме bool . Обратите внимание, что char , signed char и unsigned char - это три разных типа для таких механизмов, как перегрузка и шаблоны.

Типы int и unsigned int имеют размер четыре байта. Однако переносимый код не должен зависеть от размера int , потому что стандарт языка допускает, чтобы это зависело от реализации.

C / C ++ в Visual Studio также поддерживает целочисленные типы размера. Для получения дополнительной информации см. __int8, __int16, __int32, __int64 и целочисленные пределы.

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

Диапазон перечисляемых типов зависит от языкового контекста и указанных флагов компилятора. Для получения дополнительной информации см. Объявления и перечисления перечислений C.

См. Также

Ключевые слова
Встроенные типы

Каковы критерии выбора между типами данных short / int / long ?, C ++ FAQ

Другие вопросы по теме: Если короткое int того же размера, что и
int в моей конкретной реализации, зачем выбирать тот или иной? Если
Я начинаю учитывать фактический размер переменных в байтах, не так ли?
сделать мой код непереносимым (поскольку размер в байтах может отличаться от
реализация к реализации)? Или мне просто нужно больше выбирать размеры
больше, чем мне действительно нужно, как своего рода буфер безопасности?

Ответ: Обычно рекомендуется писать код, который можно перенести на
другая операционная система и / или компилятор.В конце концов, если вы добьетесь успеха
в том, что вы делаете, кто-то другой может захотеть использовать это где-нибудь еще. Это может быть
немного сложно со встроенными типами, такими как int и short, поскольку
C ++ не дает гарантированных размеров. Однако C ++ дает вам две вещи, которые
может помочь: гарантировано минимальных размеров , и обычно это все, что вам нужно
необходимо знать, и стандартный заголовок C, который предоставляет typedef для размера
целые числа.

C ++ гарантирует, что char составляет ровно один байт
который составляет не менее 8 бит, short не менее 16 бит, int равен
не менее 16 бит, а long - не менее 32 бит.Это также гарантирует
беззнаковая версия каждого из них того же размера, что и оригинал,
например, sizeof (короткое без знака) == sizeof (короткое).

При написании переносимого кода не следует делать дополнительных предположений о
эти размеры. Например, не предполагайте, что int имеет 32 бита. Если у тебя есть
интегральная переменная, которая требует как минимум 32 бита, используйте длинную или
unsigned long, даже если sizeof (int) == 4 в вашем конкретном
выполнение. С другой стороны, если у вас есть целочисленная переменная величина
который всегда будет соответствовать 16 битам и , если вы хотите минимизировать
использование памяти данных, используйте короткие или беззнаковые короткие, даже если вы
знать sizeof (int) == 2 в вашей конкретной реализации.

Другой вариант - использовать следующий стандартный заголовок C (который может или может
не предоставляется поставщиком компилятора C ++):

#include  / *  не входит в стандартный C ++  * /
 

Этот заголовок определяет определения типов для таких вещей, как int32_t и
uint16_t, которые представляют собой 32-битное целое число со знаком и 16-битное беззнаковое
целое число соответственно. Там есть и другие вкусности. Мой
рекомендуется использовать эти целочисленные типы "размера" только там, где они
действительно нужны.Некоторые люди преклоняются перед последовательностью, и они очень
соблазн использовать эти целые числа везде просто потому, что они
нужны были где-то . Последовательность хорошая, но это не
очень хорошо, и использование этих typedef повсюду может вызвать некоторые головные боли
и даже возможные проблемы с производительностью. Лучше использовать здравый смысл, который часто
заставляет вас использовать обычные ключевые слова, например, int, unsigned,
и т. д., где вы можете, и использование целочисленных типов с явно заданным размером, например,
int32_t и т. д.где ты должен.

Обратите внимание, что здесь есть некоторые тонкие компромиссы. В некоторых случаях ваш компьютер
могли бы манипулировать меньшими объектами быстрее, чем более крупными, но в
в других случаях все наоборот: арифметика int может быть быстрее, чем
краткая арифметика по некоторым реализациям. Другой компромисс - пространство данных
против кодового пространства: арифметика int может генерировать меньше двоичного кода, чем
краткая арифметика по некоторым реализациям. Не упрощай
предположения. Просто потому, что конкретная переменная может быть объявлена ​​как
короткий не обязательно означает должен , даже если вы пытаетесь
сэкономить место.

Обратите внимание, что стандарт C не гарантирует , что
определяет int n _t и uint n _t
специально для n = 8, 16, 32 или 64. Однако если базовый
реализация предоставляет целые числа любого из этих размеров,
требуется, чтобы содержать соответствующие определения типов. Кроме того, вы
гарантированно иметь typedef для размеров n = 8, 16 и 32, если ваш
реализация соответствует стандарту POSIX. Сложите все это вместе, и будет справедливо сказать
что подавляющее большинство реализаций, хотя и не все,
будет иметь typedef для этих типичных размеров.

Список всех спецификаторов формата в программировании на C

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

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

Подробнее - Список всех типов данных в C

Short)

двойной

% lu

ничего

Спецификатор формата Описание Поддерживаемые типы данных
% c Символ char
9048 unsigned char % d
Целое число со знаком короткое
беззнаковое короткое
int
long
% e or% E Научное представление значений с плавающей запятой float
double
% f Floating point
% g или% G Аналогично% e или% E float
double
% hi Целое со знаком (короткое) короткое
% hu
unsigned short
% i Signed Integer short
unsigned short
int
long 9078 4
% l или% ld или% li Целое число со знаком long
% lf с плавающей точкой двойной
% Lf двойной Целое число без знака Целое число без знака
Длинное число без знака
% lli,% lld Целое число со знаком long long
% llu Целое число без знака

long o Восьмеричное представление целого числа. short
unsigned short
int
unsigned int
long
% p Адрес указателя на void void * void *
% s String char * u Целое число без знака целое число без знака
длинное без знака
% x или% X Шестнадцатеричное представление целого числа без знака short
unsigned short
int
unsigned int
long
%% Печатает% character

О Панкае

Панкай Пракаш - основатель, редактор и блогер Codeforwin.Он любит изучать новые технологии и писать статьи по программированию, особенно для начинающих. Он работает в Vasudhaika Software Sols. как инженер-разработчик программного обеспечения и управляет Codeforwin. Короче говоря, Панкадж - веб-разработчик, блоггер, ученик, любитель технологий и музыки.

Подписаться на: Twitter | Google | Веб-сайт или все сообщения Pankaj

4.5 - Целые числа без знака и почему их следует избегать

Целые числа без знака

В предыдущем уроке (4.4 - Целые числа со знаком) мы рассмотрели целые числа со знаком, которые представляют собой набор типов, которые могут содержать положительные и отрицательные целые числа, включая 0.

C ++ также поддерживает целые числа без знака. Беззнаковые целые числа - это целые числа, которые могут содержать только неотрицательные целые числа.

Определение целых чисел без знака

Чтобы определить целое число без знака, мы используем ключевое слово без знака . По соглашению это ставится перед типом:

.

беззнаковый короткий нам;

беззнаковый int ui;

беззнаковая длинная ul;

беззнаковый длинный длинный ull;

Диапазон целых чисел без знака

1-байтовое целое число без знака имеет диапазон от 0 до 255.Сравните это с 1-байтовым диапазоном целых чисел со знаком от -128 до 127. Оба могут хранить 256 различных значений, но целые числа со знаком используют половину своего диапазона для отрицательных чисел, тогда как целые числа без знака могут хранить положительные числа, которые в два раза больше.

Вот таблица, показывающая диапазон для целых чисел без знака:

Размер / тип Диапазон
1 байт без знака от 0 до 255
2 байта без знака 0 до 65 535
4 байта без знака 0 до 4 294 967 295
8 байт без знака 0 до 18 446 744 073 709 551 615

n-разрядная переменная без знака имеет диапазон от 0 до (2 n ) -1.

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

Запоминание условий со знаком и без знака

Новых программистов иногда путают подписанные и неподписанные. Вот простой способ запомнить разницу: чтобы отличить отрицательные числа от положительных, мы используем отрицательный знак. Если знак не указан, мы предполагаем, что число положительное.Следовательно, целое число со знаком (целое число со знаком) может отличать положительное от отрицательного. Целое число без знака (целое число без знака) предполагает, что все значения положительны.

Целочисленное без знака переполнение

Что произойдет, если мы попытаемся сохранить число 280 (для представления которого требуется 9 бит) в 1-байтовом (8-битном) целом числе без знака? Ответ - переполнение.

Как ни странно, в стандарте C ++ прямо говорится, что «вычисление с использованием беззнаковых операндов никогда не может переполниться».Это противоречит общему мнению программистов о том, что целочисленное переполнение охватывает как подписанные, так и неподписанные варианты использования (цитировать) . Учитывая, что большинство программистов рассмотрело бы это переполнение, мы будем называть его переполнением, несмотря на утверждения C ++ об обратном.

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

Число 280 слишком велико для нашего 1-байтового диапазона от 0 до 255.1 больше, чем наибольшее число типа, равно 256. Следовательно, мы делим 280 на 256, получая 1 остаток 24. Остаток 24 - это то, что сохраняется.

Вот еще один способ думать о том же. Любое число, превышающее наибольшее число, представленное типом, просто «оборачивается» (иногда это называется «обертывание по модулю» или, что более неясно, «насыщенность»). 255 находится в диапазоне 1-байтового целого числа, поэтому 255 подойдет. 256, однако, находится за пределами диапазона, поэтому он возвращается к значению 0.257 переходит к значению 1. 280 переходит к значению 24.

Давайте посмотрим на это, используя 2-байтовые целые числа:

#include

int main ()

{

unsigned short x {65535}; // максимальное возможное 16-битное беззнаковое значение

std :: cout << "x was:" << x << '\ n';

x = 65536; // 65536 находится за пределами нашего диапазона, поэтому мы получаем

std :: cout << "x is now:" << x << '\ n';

x = 65537; // 65537 вне нашего диапазона, поэтому мы получаем циклический перенос

std :: cout << "x is now:" << x << '\ n';

возврат 0;

}

Как вы думаете, каким будет результат этой программы?

 x было: 65535
x сейчас: 0
x сейчас: 1
 

Также можно обернуть в другую сторону.0 можно представить в виде 2-байтового целого числа, так что это нормально. -1 не является представимым, поэтому он переходит в верхнюю часть диапазона, производя значение 65535. -2 оборачивается до 65534. И так далее.

#include

int main ()

{

unsigned short x {0}; // наименьшее возможное 2-байтовое значение без знака

std :: cout << "x was:" << x << '\ n';

х = -1; // -1 находится за пределами нашего диапазона, поэтому мы получаем циклический перенос

std :: cout << "x is now:" << x << '\ n';

х = -2; // -2 вне нашего диапазона, поэтому мы получаем циклический перенос

std :: cout << "x is now:" << x << '\ n';

возврат 0;

}

 x было: 0
x сейчас: 65535
x сейчас: 65534
 

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

Многие заметные ошибки в истории видеоигр произошли из-за поведения переноса целых чисел без знака. В аркадной игре Donkey Kong невозможно пройти уровень ниже 22 из-за ошибки переполнения, из-за которой у пользователя недостаточно бонусного времени для завершения уровня.

В компьютерной игре Civilization Ганди был известен тем, что часто был первым, кто применил ядерное оружие, что, похоже, противоречит его ожидаемой пассивности.Игроки полагали, что это результат агрессии Ганди, изначально установленной на 1, но если он выберет демократическое правительство, он получит модификатор -2. Это приведет к тому, что его агрессия превысит 255, что сделает его максимально агрессивным! Однако совсем недавно Сид Мейер (автор игры) пояснил, что на самом деле это не так.

Споры по поводу чисел без знака

Многие разработчики (и некоторые крупные компании, например, Google) считают, что разработчикам следует избегать целых чисел без знака.

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

Во-первых, рассмотрим вычитание двух беззнаковых чисел, таких как 3 и 5. 3 минус 5 равно -2, но -2 не может быть представлено как беззнаковое число.

#include

int main ()

{

unsigned int x {3};

целое число без знака y {5};

std :: cout << x - y << '\ n';

возврат 0;

}

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

Это происходит из-за перехода -2 к числу, близкому к верхнему пределу диапазона 4-байтового целого числа.Обычный нежелательный перенос происходит, когда целое число без знака многократно уменьшается с помощью оператора - . Вы увидите пример этого, когда появятся петли.

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

Рассмотрим следующий фрагмент:

void doSomething (unsigned int x)

{

// Выполнить код x раз

std :: cout << "x is" << x << '\ n';

}

int main ()

{

doSomething (-1);

возврат 0;

}

Автор doSomething () ожидал, что кто-то вызовет эту функцию только с положительными числами.Но звонящий передает -1 . Что происходит в этом случае?

Аргумент со знаком -1 неявно преобразуется в беззнаковый параметр. -1 не входит в диапазон беззнакового числа, поэтому он завершается до некоторого большого числа (вероятно, 4294967295). Тогда ваша программа становится баллистической. Хуже того, нет хорошего способа предотвратить это состояние. C ++ может свободно преобразовывать числа со знаком и без знака, но не проверяет диапазон, чтобы убедиться, что вы не переполняете свой тип.

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

Некоторые современные языки программирования (например, Java) и фреймворки (например, .NET) либо не включают беззнаковые типы, либо ограничивают их использование.

Новые программисты часто используют целые числа без знака для представления неотрицательных данных или для того, чтобы воспользоваться преимуществами дополнительного диапазона. Бьярн Страуструп, разработчик C ++, сказал: «Использование беззнакового вместо int для получения еще одного бита для представления положительных целых чисел почти никогда не является хорошей идеей».

Избегайте использования чисел без знака, за исключением особых случаев или когда это необходимо.

Не избегайте отрицательных чисел, используя беззнаковые типы. Если вам нужен больший диапазон, чем предлагает число со знаком, используйте одно из целых чисел гарантированной ширины, показанных в следующем уроке (4.6 - Целые числа фиксированной ширины и size_t).

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

Так где же разумно использовать беззнаковые числа?

В C ++ все еще есть несколько случаев, когда можно (или необходимо) использовать беззнаковые числа.

Во-первых, числа без знака предпочтительнее при работе с битами (рассматривается в главе O (это заглавная буква «о», а не «0»).

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

Также обратите внимание, что если вы разрабатываете для встроенной системы (например, Arduino) или какого-либо другого контекста, ограниченного процессором / памятью, использование чисел без знака более распространено и приемлемо (а в некоторых случаях неизбежно) по соображениям производительности.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *