2013-07-19 27 views
7

Dato questo frammento di codice:operatore sizeof restituisce 4 per (char + short)

#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; 
    } 

Perché sizeof(c + i) == 4?

+9

Promozione intera? – nouney

+4

(c + i) viene aggiunto per primo e la dimensione di è calcolata per il risultante .. e il risultato è un numero intero .. quindi la dimensione è 4 .. –

+4

Nitpick: 'sizeof' non è una funzione, è un operatore. – milleniumbug

risposta

17

c + i è un'espressione intera (promozione intero!), Quindi ritorna sizeof()sizeof(int)

3

Il C utilizza int per ogni calcolo intero, se non diversamente specificato. Sulla tua piattaforma, int è chiaramente lungo 32 bit, pertantorestituisce 4. Se il compilatore usasse numeri interi a 64 bit, sarebbe 8.

+0

un po 'fuori dal mondo, ma c'è qualche compilatore noto che usa 64 bit? – keltar

+0

Si tratta dell'architettura attuale, ad esempio SPARC64 - ILP64/SILP64 –

4

I tipi interi più piccoli di int vengono promossi quando viene eseguita un'operazione su . Se tutti i valori del tipo originale possono essere rappresentati come int, il valore del tipo più piccolo viene convertito in un int; in caso contrario, viene convertito in un int unsigned.

Le promozioni intere richiedono la promozione di ciascuna variabile (c e i) in dimensione 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

Condivisione del capitolo interessante con te [Conversioni operatore: conversioni aritmetiche] (http://csweb.cs.wfu.edu/~torgerse/Kokua/More_SGI/007- 0701-150/sgi_html/ch05.html) –