L'aritmetica in modalità mista (aritmetica tra gli operandi di diversi tipi e/o dimensioni) è legale ma fragile. Lo standard C definisce le regole per la promozione del tipo per convertire gli operandi in una rappresentazione comune. La promozione di tipo automatico consente al compilatore di fare qualcosa di sensato per le operazioni in modalità mista, ma "sensibile" non significa necessariamente "corretto".
Per sapere veramente se il comportamento è corretto, è necessario prima comprendere le regole per la promozione e quindi comprendere la rappresentazione dei tipi di dati. In termini molto generali:
- corta tipi vengono convertiti in tipi più lunghi (
float
a double
, short
a int
, ecc)
- tipi interi vengono convertiti in tipi a virgola mobile
- firmati/unsigned le conversioni favoriscono l'evitamento della perdita di dati (se firmata viene convertita in non firmata o viceversa dipende dalla dimensione dei rispettivi tipi)
Se il codice come x > y
(dove x
e hanno tipi diversi) è giusto o sbagliato dipende dai valori che possono assumere x
e . Nella mia esperienza è prassi comune proibire (tramite lo standard di codifica) conversioni implicite di tipo. Il programmatore deve considerare il contesto ed eseguire esplicitamente qualsiasi tipo di conversione necessaria.
fonte
2009-04-17 18:19:50
Grazie, quindi ciò significa che se f = 1.0162 sarebbe int f == 1, quindi dovrei semplicemente ridimensionarlo, f * = 1000; così int f == 1016 per mantenere la precisione? – sevenboarder
Non è possibile rappresentare tutti gli interi esattamente come float. Non con la mantissa a 24 bit di float. Se fosse doppio, sì, ma non float :) – Joey
@Johannes, hai ragione, sto ricordando male una domanda che ho risposto di recente, aggiornato per risolvere il problema. – paxdiablo