2013-07-19 20 views
7

Biorąc pod uwagę ten fragment kodu:operator sizeof zwraca 4 dla (char + krótka)

#include <stdio.h> 

    int main() { 

     short i = 20; 
     char c = 97; 

     printf("%d, %d, %d\n", sizeof(i), sizeof(c), sizeof(c + i)); 

     return 0; 
    } 

Dlaczego sizeof(c + i) == 4?

+9

Integer promotion? – nouney

+4

(c + i) jest dodawany jako pierwszy, a sizeof jest obliczany dla wypadkowej .., a wynikiem jest liczba całkowita .. tak rozmiar to 4. .. –

+4

Nitpick: 'sizeof' nie jest funkcją, jest operatorem. – milleniumbug

Odpowiedz

17

c + i jest wyrazem całkowitą (promocja całkowitą!), Tak sizeof() powraca sizeof(int)

3

C wykorzystuje int wszystkie obliczenia całkowitej, o ile nie podano inaczej. Na twojej platformie int ma wyraźnie długość 32bit, więc zwraca 4. Jeśli twój kompilator używałby 64-bitowych liczb całkowitych, byłby to 8.

+0

trochę offtopic, ale czy istnieje jakiś znany kompilator, który używa 64-bitowych ints? – keltar

+0

Chodzi bardziej o rzeczywistą architekturę - na przykład SPARC64 - ILP64/SILP64 –

4

Typy integer mniejsze niż int są promowane, gdy wykonywana jest operacja . Jeśli wszystkie wartości oryginalnego typu mogą być reprezentowane jako int, wartość mniejszego typu jest konwertowana na int; w przeciwnym razie jest konwertowany na unsigned int.

Promocja Integer wymaga promocji każdej zmiennej (c i i) do rozmiaru int.

short i = 20; 
char c = 97; 
//The two int values are added and the sum is truncated to fit into the char type. 
char a = c + i; 
printf("%d, %d, %d %d\n", sizeof(i), sizeof(c), sizeof(c + i),sizeof(a)); 

2, 1, 4 1 
+0

Interesujący rozdział z Tobą [Konwersje operatora: Konwersje arytmetyczne] (http://csweb.cs.wfu.edu/~torgerse/Kokua/More_SGI/007- 0701-150/sgi_html/ch05.html) –