2010-04-18 12 views
6

Ho un sacco di #define nel mio codice. Ora uno strano problema si è insinuato.Il valore di C definisce le modifiche in modo imprevisto

ho questo:

#define _ImmSign 010100 

(che sto cercando di simulare un numero binario)

Ovviamente, mi aspetto il numero di diventare 10100. Ma quando uso il numero si è trasformato in 4160.

Che cosa sta succedendo qui? E come lo fermo?

ULTERIORI

Okay, questo è dovuto alla lingua interpretare questo come un ottale. Esiste tuttavia un modo intelligente per forzare la lingua a interpretare i numeri come numeri interi? Se uno 0 definisce ottale, e 0 x definisce esadecimale ora che ci penso ...

+3

010100 in ottale è 0 * 1 + 0 * 8 + 1 * 64 + 0 * 512 + 1 * 4096 = 64 + 4096 = 4160. –

+0

http://www.boost.org/doc/libs/1_42_0/libs/utility/utility.htm#BOOST_BINARY Questo può essere utile a voi. anche se C++, penso che sia il preprocessore solo – Anycorn

+0

@aaa thx per il suggerimento, ma non credo che sia permesso usare una libreria di terze parti. – NomeN

risposta

1

Se siete disposti a scrivere codice non portabile ed usare gcc, è possibile utilizzare il binary constants extension:

#define _ImmSign 0b010100 
+1

argh ... Ho cercato questo più volte ma non è mai venuto in google. COSÌ rocce! – NomeN

13

letterali interi che iniziano con un 0 vengono interpretati come ottale, non decimale, nello stesso modo in cui gli interi che iniziano con 0x vengono interpretati come esadecimale.

Rimuovere lo zero iniziale e si dovrebbe essere a posto.

Nota anche che gli identificatori che iniziano con un trattino basso seguito da una lettera maiuscola o un altro carattere di sottolineatura sono riservati per l'implementazione, quindi non dovresti definirli nel tuo codice.

+0

risposta veloce! C'è un altro modo per fermare questo, quindi rimuovere lo zero iniziale? – NomeN

+2

@NomeN: No; questa è una parte fondamentale della lingua. –

4

La prefissazione di un numero intero con 0 ne fa un numero ottale invece di decimale e 010100 in ottale è 4160 in decimale.

+0

un'altra risposta veloce, grazie! C'è un altro modo di risolvere questo al posto di rimuovere gli 0 iniziali? – NomeN

+0

Non che io sappia. – Maulrus

2

Non c'è alcuna sintassi del numero binario in C, almeno senza alcuna estensione del compilatore. Quello che vedete è 010100 interpretato come un ottale (base 8): si è fatto quando un letterale numerica inizia con 0.

2

010100 viene considerato come ottale da C a causa del leader 0. Octal 10100 è 4160.

0

ottale :-)

È possibile trovare these macros helpful per rappresentare numeri binari con numeri decimali o ottali nella forma di 1 e 0. Gestiscono gli zeri iniziali, ma sfortunatamente devi scegliere il nome corretto della macro a seconda che tu abbia o meno uno zero iniziale. Non perfetto, ma si spera utile.

Problemi correlati