Domanda

sto provando questo codice sul compilatore C ++ di GNU e non riesco a capire il suo comportamento:

#include <stdio.h>;

int main()
{
    int  num1 = 1000000000;
    long num2 = 1000000000;
    long long num3;
    //num3 = 100000000000;
    long long num4 = ~0;

    printf("%u %u %u", sizeof(num1), sizeof(num2), sizeof(num3));
    printf("%d %ld %lld %llu", num1, num2, num3, num4);
    return 0;
}

Quando ho Rimuovere il commento dalla riga di commento, il codice non viene compilato e sta dando un errore:

  

errore: costante intera è troppo grande per tipo lungo

Ma, se il codice viene compilato così com'è e viene eseguito, produce valori molto più grandi di 10 miliardi.

Perché?

È stato utile?

Soluzione

Le lettere 100000000000 compongono un intero letterale costante, ma il valore è troppo grande per il tipo int. È necessario utilizzare un suffisso per modificare il tipo del letterale, cioè.

long long num3 = 100000000000LL;

Il LL suffisso rende il letterale in tipo long long. C non è "intelligente" sufficiente per concludere questo dal tipo sulla sinistra, il tipo è una proprietà della stessa letterale, non è il contesto in cui viene utilizzato.

Altri suggerimenti

Prova:

num3 = 100000000000LL;

E BTW, in C ++ si tratta di un'estensione del compilatore, la norma non definisce lunga lunga, questo è parte di C99.

Dipende in quale modalità si sta compilando. non molto tempo fa parte del C ++ standard, ma solo (di solito) supportato come estensione. Questo influenza il tipo di letterali. letterali intero decimale senza alcun suffisso sono sempre di tipo int se int è abbastanza grande per rappresentare il numero, lungo altrimenti. Se il numero è pari troppo grande per tempo il risultato dipende dall'implementazione (probabilmente solo un numero di tipo int lungo che è stato troncato per compatibilità all'indietro). In questo caso è necessario utilizzare in modo esplicito il suffisso LL per consentire alla lunga lunga estensione (sulla maggior parte dei compilatori).

La versione successiva C ++ supporterà ufficialmente lungo tempo in un modo che non sarà necessario alcun suffisso meno che non si voglia esplicitamente la forza il tipo del letterale di essere almeno lunga lunga. Se il numero non può essere rappresentato nel tempo il compilatore cercherà automaticamente di utilizzare lunga lunga anche senza il suffisso LL. Credo che questo sia il comportamento di C99 pure.

il codice compila qui bene (anche con quella riga non commentata. Dovuto cambiarlo in

num3 = 100000000000000000000;

per iniziare a ricevere l'avviso.

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