Является ли " 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
. В этом списке каждый тип предоставляет по крайней мере, столько же, сколько и в предыдущем списке. Также могут быть определенные реализацией расширенные целочисленные типы со знаком. Стандартные и расширенные целочисленные типы со знаком совместно называются целочисленными типами со знаком. Равнинаint
s имеют естественный размер, предложенный архитектурой среды выполнения; другие целочисленные типы со знаком предоставляются для удовлетворения особых потребностей.
простые 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
.