2013-08-21 53 views
8

Ehm .. I niby”o choć modyfikatory jak długi/krótkim powiększa/zmniejsza ilość pamięci przydzielonej kiedy zmienna są tworzone, ale ...Dlaczego "long int" ma taki sam rozmiar jak "int"? Czy ten modyfikator działa w ogóle?

#include <stdio.h> 

#define test_int int 
#define long_int long int 
#define long_long_int long long int 

void main() 
{ 
    printf("%i\n", sizeof (test_int)); //output 4 
    printf("%i\n", sizeof (long_int)); //output 4. Why? wasn't I modified it's size? 
    printf("%i\n", sizeof (long_long_int)); //output 8 
} 

Z nieznanych powodów, drukuje rozmiar int i długi int jako taki sam. Używam edycji ekspresowej vC++ 2010. Niestety, trudno znaleźć odpowiedź w google, zawsze pokazuje długie i int jako osobne typy.

+2

Dlaczego * nie powinny * rozmiary są takie same ?! Typy są różne, tylko to się liczy. Każdy typ może reprezentować zestaw wartości określonych przez normę, ale za darmo można reprezentować więcej. –

+1

Co znaczy więc ** długi ** modyfikator? Czy nie powinno się zwiększać ilości przydzielonej pamięci? – Kosmos

+0

Nic z tego nie ma nic wspólnego z "pamięcią" lub "przydziałem", a "długie" nie jest "modyfikatorem". Raczej "int" i "long int" to dwa różne typy. Obie reprezentują liczby całkowite. –

Odpowiedz

12

Dlatego, że MS zdecydować się long 32 bitów, nawet na systemie 64-bitowym jest, że istniejący Windows API, z powodów historycznych stosować mieszaninę int i long podobnych rzeczy, a oczekuje się, że jest to s 32-bitowa wartość (niektóre z nich powracają do czasów, kiedy Windows był systemem 16-bitowym). Aby przekonwertować stary kod na nową architekturę 64-bitową, zdecydowali się na zachowanie 32-bitowych wartości long, aby aplikacje mieszające int i long w różnych miejscach nadal się kompilowały.

Nie ma nic w standardzie C++, który nakazuje, że long powinien być większy niż (na pewno nie jest na większości systemów 32-bitowych). Cały standard mówi, że rozmiar short < = int < = long - i że short ma co najmniej 16 bitów, jeśli pamięć służy [niekoniecznie wyrażona jako "powinna wynosić co najmniej 16 bitów", myślę, że wspomina zakres wartości].

+0

Rzeczywiście, wspomina, że ​​'krótki' powinien przynajmniej zawierać od -32767 do +32767. Zauważ, że standard nie wymaga -32768 (najniższa wartość dla 16-bitowej liczby w dopełnieniu * 2 *), ponieważ określa sposób obsługi liczb ujemnych. – Medinoc

+0

Dzięki za wiele Mats, ale Wydaje się, że długo jest używany jako kolejny alias dla int przez ostatnie 30 lat! jeśli to nie będzie większe, po co zawracać sobie głowę wzmianką w standardzie! Po prostu nie ma sensu mieć czegoś zwanego długim, a nie jednorazowym od 30 lat, w głównych kompilatorach i systemie, który nie zapewnia więcej miejsca niż int! To jest niedorzeczne, wszystkie nowe języki mają znaczącą semantykę, C++ jest wyjątkiem w każdej rzeczy, jak się wydaje! – Breeze

+1

@Hossein: 30 lat temu, wiele kompilatorów miało 'int' jako 16-bitową wartość, a' long' było 32. Obecnie, na platformach innych niż Windows, które mają 64-bitowe procesory, 'long' jest rzeczywiście 64 bitami , gdzie 'int' to 32 bity. Ale najważniejsze jest to, że nie ma GWARANCJI, że typ jest jakiejś konkretnej wielkości dla "długiego", innego niż minimum 32-bitowe. Od tego momentu zależy to od kompilatora, jeśli jest większy lub większy. –

1

Implementacje C i C++, długość jest większa lub równa int. Dzisiejsze najpopularniejsze platformy komputerowe, takie jak Windows i Linux, działają głównie na procesorach 32-bitowych, a większość kompilatorów dla tych platform używa 32-bitowego int, który ma taki sam rozmiar i reprezentację jak długi.

+3

To jest włączenie, "długie" jest "tak duże lub większe niż" int ". Nie ma wymogu, aby być większym. –

+0

@MatsPetersson 'sizeof (int) <= sizeof (long)'. dla 32 bitów jest równy, ale w 64-bitowym jest inny. –

+1

W wersji 64-bitowej MOŻE być inny. Na przykład nie jest to na komputerze z Windows. –

0

oto nakazujący

char 
short (int) 
int 
long (int) 
long long (int) 

Standard wymaga ta sizeof(char) == 1 jest prawdziwa. Standard wymaga również, aby: int miał co najmniej 16 bitów. long int ma co najmniej 32 bity, a long long int ma co najmniej 64 bity.

W przypadku 32-bitowych procesorów, które obsługują, kompilatory zwykle ustawiają int na 4 bajty. Rozszerzenie nie powtórzyło się w systemach 64-bitowych (w każdym razie dla MSVC) ze względu na kompatybilność.

+0

urgh może dlatego właśnie przez długi int powinienem być bardziej niż int. kiedy uczyłem się C++, zacząłem od borlanda C++ 3.1 – Kosmos

+0

C wymaga również, aby int miało co najmniej 16 bitów i było co najmniej 32-bitowe. – Potatoswatter

+0

Nie jestem pewien, czy można powiedzieć, że 'int' było zawsze" typowo "16 bitów. Wracając, gdy 16-bitowe 'int' było powszechne, maszyny różniły się o wiele więcej i prawdopodobnie było ich tyle samo, co 32-bitowe' int' (i co najmniej kilka z 36-bitowymi 'int' lub innymi wariantami, które byłyby dziś uważany za egzotyczny). –

4

Wszystko, norma wymaga, że:

sizeof(char) == 1 

i

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

(a odpowiednie unsigned typów mają tę samą wielkość, jak podpisane rodzaje).

Ponadto istnieją minimalne rozmiary dla każdego typu pośrednio określone limity na wartościach INT_MAX itp .: char musi wynosić co najmniej 8 bitów, short i int 16, i long long 64.

na platformach 16 bitów, to jest typowe dla obu short i int do być 16 bitów; na platformach 32-bitowych (oraz 36- i 48-bitowych platformach , które nadal istnieją), int i long są prawie zawsze takie same, jak rozmiar . Na nowoczesnych 64-bitowych platformach (z adresowaniem bajtów), racjonalnym rozwiązaniem byłoby sprawienie, by wszystkie cztery typy miały różne rozmiary (chociaż można argumentować, że zgodnie ze standardem, int powinno być 64-bitowe, co oznaczałoby, że int, long i long long wszystkie miały ten sam rozmiar).

0

Chodzi o to, że błędnie rozumiesz znaczenie int i long (to nie jest przymiotnik).

Co średnia definiuje to, że numer bitów w każdym rodzaju wymaga tego związku do pozostania w miejscu:

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

int samo w sobie może być tak długo, jak short się na tak długo, jak long w zależności od sposobu wdrożenia.

Konstruktorzy kompilatorów dążą do maksymalizacji wydajności arytmetyki int, co sprawia, że ​​jest to naturalny rozmiar dla procesora lub systemu operacyjnego i odpowiednio ustawia inne typy.

Jednak korzystanie z long int, ponieważ int może zostać pominięty, to tak samo jak long definicji.

+0

sizeof (long) == sizeof (long long) jest możliwy i często spotykany wśród 64-bitowych platform poza Windows. – Potatoswatter

+0

@Potatoswatter: ???? Napisałem <= ... –