Domanda

Se scrivo "long i = 1;" invece di "long i = 1l;", sarà la 1 riconosciuto come int e poi convertito in modo implicito long?

Modifica Grazie a tutti. Vedo che c'è alcuna conversione di tipo. E 'questo anche il caso del u suffisso (come 10u)? Allora che cosa è l'uso di quelli l e u?

È stato utile?

Soluzione

Il compilatore vedere ciò che si sta tentando di assegnare e impostare immediatamente il valore a 1. Non v'è alcuna conversione tipo che accade con un letterale. Anche se lei ha detto di lunghezza x = 1,0, non si vedrà una conversione di tipo runtime.

A proposito, su Windows, lungo e int sono gli stessi quindi non ci sarebbe una conversione di tipo in ogni caso.

[Edit: fatto ultimo commento specifico a Windows; rimosso riferimento preprocessore]

Altri suggerimenti

Il tipo di 1 costante è int, quindi tecnicamente una conversione di tipo sarà fatto, ma sarà fatto al momento della compilazione e nulla è perduto.

Tuttavia, si consideri l'esempio più interessante di:

int main(void)
{
    long long i = -2147483648;
    long long j = -2147483647 - 1;

    printf( " i is %lld, j is %lld\n", i, j);

    return(0);
}

Ottengo i seguenti risultati da diversi compilatori:

  • MSCV 9 (Versione 15.00.21022.08):

                i is 2147483648, j is -2147483648
    
  • GCC (3.4.5):

                i is -2147483648, j is 0
    
  • Comeau (4.3.10.1):

                i is 2147483648, j is -2147483648
    
  • Mars digitale:

                i is -2147483648, j is -2147483648
    

Non sono ancora sicuro come contabilizzare le differenze. Potrebbe essere uno o più di:

  • bug del compilatore
  • C90 C99 vs regole in promozione operando (supporto "long long" è C99, ma alcuni di questi compilatori potrebbe essere la compilazione di C90 con "long long" come estensione)
  • implementazione comportamento definito
  • comportamento non definito

FWIW, il comportamento di MSVC e Comeau è quello che mi aspettavo - che è qualcosa che molti potrebbero trovare ancora sorprendente. La logica (nella mia mente) per la prima operazione è:

  • -2147483648 viene formato token come '-' e 2147483648
  • 2147483648 è un unsigned int (dal momento che non può essere inserito in un int - credo che questo è diverso in C99)
  • applicando le unari '-' Risultati operatore in 2147483648 di nuovo a causa di regole aritmetiche non firmati
  • conversione che in un lungo tempo non cambia il segno.

La logica per la seconda operazione è:

  • -2147483647 viene formato token come '-' e 2147483647
  • 2147483647 è un int firmato
  • sottraendo risultati 1 in -2147483648 poiché non c'è problema che rappresenta il numero
  • conversione che in un lungo tempo non cambia il segno.

La maggior parte dei compilatori moderni dovrebbero essere abbastanza intelligente per capire che si sta assegnando il letterale ad un long, e faranno il letterale di tale tipo, invece di forzare una conversione pre-assegnazione.

abbastanza sicuro che se scritto esattamente come indicato, sarà equivalente a i = 1l; Ogni conversione sarà effettuata al momento della compilazione.

Tuttavia, se si scrive

lungo i = (unsigned int) -1;

allora io probabilmente non sarà quello che vi aspettavate.

compilatori di oggi lo riconosceranno e generare lo stesso risultato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top