Поправьте меня, если я ошибаюсь,
int - 4 байта с диапазоном значений от -2 147 483 648 до 2 147 483 647 (2 ^ 31)
long - 4 байта с диапазоном значений от -2 147 483 648 до 2 147 483 647 (2 ^ 31)
В чем разница в C ++? Могут ли они использоваться как взаимозаменяемые?
#include <stdint.h>
а затем типов, которые определяют размер. Напрuint32_t
. На новой платформе вам нужно только убедиться, что stdint.h подходит для этой конкретной платформы, и ваш код работает должным образом.Ответы:
Это зависит от реализации.
Например, в Windows они такие же, но, например, в системах Alpha long было 64 бита, тогда как int было 32 бита. В этой статье рассматриваются правила для компилятора Intel C ++ на переменных платформах. Подвести итоги:
источник
Единственная гарантия, которая у вас есть:
Смотрите также: Является ли
long
гарантированно быть по крайней мере 32 бита?источник
При компиляции для x64 разница между int и long составляет где-то от 0 до 4 байтов, в зависимости от того, какой компилятор вы используете.
GCC использует модель LP64, что означает, что целые числа являются 32-битными, а длинные - 64-битными в 64-битном режиме.
Например, MSVC использует модель LLP64, что означает, что как целые, так и длинные числа являются 32-битными даже в 64-битном режиме.
источник
Сама спецификация C ++ (старая версия, но достаточно хорошая для этого) оставляет это открытым.
источник
Как указывает Кевин Хейнс, целые числа имеют естественный размер, предлагаемый средой выполнения, который должен соответствовать INT_MIN и INT_MAX.
В стандарте C89 указано, что
UINT_MAX
должно быть не менее 2 ^ 16-1,USHRT_MAX
2 ^ 16-1 иULONG_MAX
2 ^ 32-1. Это составляет не менее 16 бит для коротких и целых чисел и 32 для длинных. Для char он явно указывает, что он должен иметь не менее 8 бит (CHAR_BIT
). C ++ наследует эти правила для файла limits.h, поэтому в C ++ у нас те же основные требования к этим значениям. Вы должны , однако не проистекают из того что ИНТ по крайней мере , 2 байта. Теоретически char, int и long могут быть 1 байтом, и в этом случаеCHAR_BIT
должно быть не менее 32. Просто помните, что «байт» всегда равен размеру char, поэтому, если char больше, байт - это не только 8 бит. Больше.источник
byte
тип данных существует в C ++. Нет, не так ли? Если это так, аbyte
размер a может отличаться от 8 бит, это просто глупо. Почему они назвали его байтом, если это не обязательно 8 бит?Это зависит от вашего компилятора. Вам гарантируется, что long будет как минимум такого же размера, как int, но вам не гарантируется, что он будет больше.
источник
По большей части количество байтов и диапазон значений определяется архитектурой ЦП, а не C ++. Однако C ++ устанавливает минимальные требования, которые подробно объяснены, а Мартин Йорк допустил лишь несколько ошибок.
Причина, по которой вы не можете использовать int и long как взаимозаменяемые, заключается в том, что они не всегда имеют одинаковую длину. C был изобретен на PDP-11, где байт имел 8 бит, int - два байта и мог обрабатываться напрямую с помощью аппаратных инструкций. Поскольку программистам на C часто требовалась четырехбайтовая арифметика, было изобретено long, и это было четыре байта, обрабатываемых библиотечными функциями. Остальные машины имели другие характеристики. Стандарт C предъявлял некоторые минимальные требования.
источник
Если вы когда-нибудь компилируете свой код на другой машинной архитектуре, ОС или компиляторе другого поставщика, то полагаться на реализацию поставщика компилятора примитивных размеров типов БУДЕТ преследовать вас.
Большинство поставщиков компиляторов предоставляют файл заголовка, который определяет примитивные типы с явными размерами типов. Эти примитивные типы следует использовать, когда код потенциально может быть перенесен на другой компилятор (читайте это ВСЕГДА в КАЖДОМ экземпляре). Например, у большинства компиляторов UNIX есть
int8_t uint8_t int16_t int32_t uint32_t
. У Microsoft естьINT8 UINT8 INT16 UINT16 INT32 UINT32
. Я предпочитаю Borland / CodeGear'sint8 uint8 int16 uint16 int32 uint32
. Эти имена также напоминают размер / диапазон предполагаемого значения.В течение многих лет я использовал явные имена примитивных типов Borland и
#include
следующий файл заголовка C / C ++ (primitive.h), который предназначен для определения явных примитивных типов с этими именами для любого компилятора C / C ++ (этот файл заголовка может фактически не охватывать все компилятор, но он охватывает несколько компиляторов, которые я использовал в Windows, UNIX и Linux, он также (пока) не определяет 64-битные типы).источник
Стандарт C ++ говорит об этом так:
3.9.1, §2:
Вывод: это зависит от того, над какой архитектурой вы работаете. Любое другое предположение неверно.
источник