Является ли " int "по умолчанию" signed long int " в C++?

Is int по умолчанию signed long int в C++?

зависит ли это от платформы и / или компилятора? Если да, то как?

[EDIT]

гарантируется ли дублирование любого из следующих элементов?

signed short int
signed int
signed long int
signed long long int
unsigned short int
unsigned int
unsigned long int
unsigned long long int

6 ответов


всех целую типы различны, т. е. вы можете безопасно перегрузить функции для всех из них, и вы не получите никакого конфликта. Однако в некоторых случаях для их представления используется одинаковое количество битов. Даже если они используют одно и то же количество битов, подписанные и неподписанные типы всегда имеют другой диапазон. Кроме char, используя любой целочисленный тип без signed эквивалентно его использованию с signed, то есть signed int и int эквивалентны. char другой типа как signed char и unsigned char но char имеет то же представление и диапазон либо signed char или unsigned char. Вы можете использовать std::numeric_limits<char>::is_signed чтобы узнать, какие он использует.

к более интересным аспектам. Все следующие условия правда:

  • 7 <= std::numeric_limits<signed char>::digits
  • sizeof(char) == 1
  • sizeof(char) == sizeof(signed char)
  • sizeof(char) == sizeof(unsigned char)
  • 15 <= std::numeric_limits<short>::digits
  • sizeof(char) <= sizeof(short)
  • sizeof(short) <= sizeof(int)
  • 31 <= std::numeric_limits<long>::digits
  • sizeof(int) <= sizeof(long)
  • 63 <= std::numeric_limits<long long>::digits
  • sizeof(long) <= sizeof(long long)
  • sizeof(X) == sizeof(signed X)
  • sizeof(signed X) == sizeof(unsigned X)

(где " X " - один из char, short, int, long, и long long).

это означает, что размер все целочисленные типы могут быть одинаковыми, если эти типы содержат не менее 64 бит (и, по-видимому,Cray X-MP был такой зверь). На современных машинах типично sizeof(int) == sizeof(long) но есть машины, где sizeof(int) == sizeof(short). Ли long 32 или 64 бита зависят от фактической архитектуры и оба вида в настоящее время вокруг.


простые int подписывается, независимо от того, имеет ли он тот же размер, что и long int зависит от платформы.

что гарантировано, что

sizeof (int) <= sizeof (long)

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


что говорит стандарт: (раздел [basic.fundamental]:

существует пять стандартных целочисленных типов со знаком:signed char, short int, int, long int и long long int. В этом списке каждый тип предоставляет по крайней мере, столько же, сколько и в предыдущем списке. Также могут быть определенные реализацией расширенные целочисленные типы со знаком. Стандартные и расширенные целочисленные типы со знаком совместно называются целочисленными типами со знаком. Равнина ints имеют естественный размер, предложенный архитектурой среды выполнения; другие целочисленные типы со знаком предоставляются для удовлетворения особых потребностей.


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


на long и short модификаторы не совсем как signed и unsigned. Последние два можно поставить на любой целочисленный тип, но если их оставить, то signed - это по умолчанию для каждого типа integer (за исключением char). Так что int и signed int имеют тот же тип.

на long и short, Если вы оставите их, ни один из них не выбран, но результирующий тип отличается. long int, short int и int все разные типы, с short int int long int.

на int после long, short, signed и unsigned дополнительно: signed int и signed имеют тот же тип.


В C++ int is signed int по умолчанию, поэтому с этим нет проблем. Однако,int и long int - разному типы В C++, так что это не то же самое с точки зрения языка. Реализация int и long int специфичен для платформы / компилятора - они оба являются интегральными типами, которые могут быть идентичными. Единственное ограничение, налагаемое стандартом C++, - это sizeof( long int ) >= sizeof( int ).


signed и int а как же signed int по умолчанию.

ни тот же тип, что и signed short int или signed long int.