2012-01-26 11 views
5

Attualmente sto partendo con microcontrollori programmazione utilizzando C30 (A C compilatore basato su GCC da microchip per i loro dispositivi PIC24) e sono abilitati Strict ANSI warnings curiosità. Prima di tutto, non sapevo che in C11 i commenti come // fossero "sbagliati" e invece dovrei usare/* blah blah * /, ma quello che mi ha veramente sorpreso è questo avvertimento per una riga di codice.Come si utilizza un prefisso binario in conformità con C11?

"warning: uso di non-standard di prefisso binario"

La riga di codice è:

OSCCONbits.COSC = 0b000;

Ho guardato online in una delle bozze di C11 (ISO/IEC 9899 : 2011) e non riesce a trovare nulla sui prefissi binari in C. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

Qual è la notazione binaria corretta per C secondo C11?

+1

convertirlo in un numero esadecimale. Per quanto riguarda l'impostazione di qualcosa su (binario) '0000' perché non usare solo un normale decimale' 0' o esadecimale '0x00'? –

+6

Chi ti ha detto che // i commenti sono "sbagliati"? –

+0

Penso di aver sbagliato la mia domanda, quindi ecco alcune correzioni. So che posso usare solo hex o decimal invece di binary, volevo solo sapere qual era il modo "giusto" per usare i letterali binari. Riguardo a me che dice // i commenti sono "sbagliati", l'ho ottenuto da un avvertimento del compilatore, nessuno me l'ha detto ma il compilatore. Comunque, grazie per tutto l'aiuto ragazzi! Ho avuto delle risposte fantastiche e vorrei poterle contrassegnare tutte come risposte, ma potrei farlo solo con tristezza. – hak8or

risposta

13

C non ha costanti binarie. (Anche in C11 non sono supportati.)

Sono stati proposti come aggiunta al C99 ma la proposta è stata respinta.

Da C99 documento Motivazione:

Una proposta per aggiungere le costanti binarie è stata respinta a causa della mancanza di precedenti e l'utilità insufficiente.

Lei ha detto che si sta utilizzando un compilatore basato gcc e gcc supporta le costanti binarie: sono un'estensione GNU al linguaggio C.

costanti intere possono essere scritti come costanti binarie, costituito da una sequenza di 0 e 1 cifre, prefisso 0b o 0B. Ciò è particolarmente utile in ambienti che operano molto a livello di bit (come i microcontrollori).

Vedi gcc pagina sulle costanti binarie per ulteriori informazioni:

http://gcc.gnu.org/onlinedocs/gcc/Binary-constants.html

+0

Bummer sentivano che non era di utilità sufficiente. Io uso '0b' tutto il tempo nel codice che esegue il bit-twiddling per le operazioni su interi ad alta velocità (non avendo nulla a che fare con i microcontrollori). '0b10101010' è molto più leggibile per me di' 0xAA', per esempio. Inoltre, un disastro sentiva che non c'era un precedente; Java ha avuto '0b' per un po 'ora. –

3

C11 non ha valori letterali binari; ha solo decimale, ottale ed esadecimale, come descritto nella sezione 6.4.4.1 dello standard. Questo è invariato da C99.

6.6 paragrafo 10 dice:

Un'implementazione può accettare altre forme di espressioni costanti.

che, se ho capito bene, consente il tipo di estensione fornita dal compilatore; anche questo è invariato rispetto a C99.

La soluzione usuale consiste nell'utilizzare letterali esadecimali; ogni cifra esadecimale corrisponde a quattro cifre binarie. (E, naturalmente, 0b000 può essere scritto semplicemente come 0.)

+0

Grazie per la risposta. :) – hak8or

1

I prefissi binari non sono standard. convertirli in ottale (0) o esadecimale (0x), che sono solo prefissi definiti nello standard.

Inoltre, i commenti // sono stati introdotti nello standard C99, non sono presenti nello standard ANSI C89. Ecco perché il tuo compilatore ti avvisa.

+0

Grazie per la risposta. :) – hak8or

2

gli standard relativi ai:

  • ANSI C/"Strict ANSI" si riferisce in genere alla prima versione standard di C, standardizzato solo negli USA 1989. A volte si riferisce a come "C89".
  • ANSI C/89 divenne obsoleto nel 1990 quando C divenne uno standard internazionale C, ISO/IEC 9899: 1990, denominato "C90". C89 e C90 sono equivalenti quando si tratta di dettagli tecnici.
  • C90 è diventato obsoleto nel 1999, quando ISO C è stato aggiornato. Il nuovo standard è denominato "C99".
  • C99 è diventato obsoleto nel 2011. Il nuovo standard è denominato "C11".

Per quanto riguarda i vostri problemi di compilazione:

  • C89/C90 non consente // commenti. Sono stati introdotti nel C99.Non sono stati rimossi in C11.
  • La notazione binaria non ha mai fatto parte di nessuno standard C.

Conclusione:

  • si hanno più probabilità compilazione del codice su un compilatore C90, con alcune estensioni non standard disponibili.
+0

Grazie per la risposta. :) – hak8or

Problemi correlati