2012-01-26 12 views
5

Obecnie rozpoczynam od programowania mikrokontrolerów przy użyciu C30 (A C kompilatora opartego na GCC z mikrochipa dla ich urządzeń PIC24) i włączałem Strict ANSI warnings z ciekawości. Po pierwsze, nie wiedziałem, że w C11 komentarze takie jak // są "błędne" i zamiast tego powinienem użyć/* bla bla * /, ale to, co naprawdę mnie zaskoczyło, jest tym ostrzeżeniem dla linii kodu.Jak używać prefiksu binarnego zgodnie z C11?

"UWAGA: korzystanie z niestandardowym przedrostek dwójkowy"

Linia kodu:

OSCCONbits.COSC = 0b000;

Szukałem online w jednym z projektów C11 (ISO/IEC 9899 : 2011) i nie można znaleźć niczego o przedrostkach binarnych w C. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

Jaka jest poprawna notacja binarna dla C zgodnie z C11?

+1

przekonwertować go na liczbę szesnastkową. Jeśli chodzi o ustawienie czegoś na (binarne) '0000', dlaczego nie wystarczy użyć zwykłego dziesiętnego' 0' lub szesnastkowego '0x00'? –

+6

Kto powiedział, że // komentarze są "błędne"? –

+0

Myślę, że mogłem źle sformułować moje pytanie, więc tutaj są pewne poprawki. Wiem, że mogę po prostu użyć heksadecymalnego lub dziesiętnego zamiast binarnego, po prostu chciałem wiedzieć, jaki był "właściwy" sposób używania binarnych literałów. Odnośnie mnie mówiąc, że komentarze są "złe", mam to z ostrzeżenia kompilatora, nikt mi nie powiedział, ale kompilator. W każdym razie, dzięki za pomoc! Dostałem kilka świetnych odpowiedzi i chciałbym móc zaznaczyć je wszystkie jako odpowiedzi, ale mogłem to zrobić tylko jednemu ze smutków. – hak8or

Odpowiedz

13

C nie ma stałych binarnych. (Nawet w C11 nie są obsługiwane).

Zaproponowano je jako dodatek do C99, ale propozycja została odrzucona.

Od C99 dokumentu Uzasadnienie:

Propozycja dodać stałych binarnych został odrzucony ze względu na brak precedensu i niewystarczającej użyteczności.

Mówiłeś używasz kompilatora oparciu gcc i gcc obsługuje stałych binarnych: są rozszerzeniem GNU języka C.

Stałe całkowite mogą być zapisywane jako stałe binarnych, składający się z sekwencji 0 i 1 cyfr poprzedzony 0b lub 0B. Jest to szczególnie przydatne w środowiskach, które działają na poziomie bitów (jak mikrokontrolery).

Zobacz gcc stronę o stałych binarnych uzyskać więcej informacji:

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

+0

Bummer uważali, że nie jest wystarczająco użyteczna. Cały czas używam '0b' w kodzie, który wykonuje bit-twiddling dla szybkich operacji na liczbach całkowitych (nie mających nic wspólnego z mikrokontrolerami). '0b10101010' jest na przykład dużo bardziej czytelny niż" 0xAA ". Poza tym czuli, że nie było precedensu; Java od jakiegoś czasu ma "0b". –

3

C11 nie ma liter binarnych; ma tylko znaki dziesiętne, ósemkowe i szesnastkowe, zgodnie z opisem w sekcji 6.4.4.1 normy. To jest niezmienione od C99.

6.6 pkt 10 mówi:

implementacja może przyjąć inne formy stałych wyrażeń.

co, jeśli rozumiem to poprawnie, zezwala na rodzaj rozszerzenia udostępnianego przez Twój kompilator; jest to również niezmienione od C99.

Typowym rozwiązaniem jest używanie liter heksadecymalnych; każda cyfra szesnastkowa odpowiada czterem cyfrom binarnym. (I oczywiście 0b000 można zapisać po prostu jako 0.)

+0

Dziękuję za odpowiedź. :) – hak8or

1

Przedrostki binarne nie są standardowe. zamień je na ósemkowe (0) lub szesnastkowe (0x), które są tylko prefiksami zdefiniowanymi w standardzie.

Ponadto, komentarze // zostały wprowadzone w standardzie C99, nie są obecne w standardzie C89 ANSI. Właśnie dlatego Twój kompilator daje ci ostrzeżenie.

+0

Dziękuję za odpowiedź. :) – hak8or

2

dotyczące norm:

  • ANSI C/"Strict ANSI" zazwyczaj odnosi się do pierwszej wersji standardowej C, standaryzowaną tylko w USA 1989. Czasami jest określany jako "C89".
  • ANSI C/89 stał się przestarzały w 1990 roku, kiedy C stał się międzynarodowym standardem C, ISO/IEC 9899: 1990, określanym jako "C90". C89 i C90 są równoważne, jeśli chodzi o szczegóły techniczne.
  • C90 stał się przestarzały w 1999 roku, kiedy ISO C zostało zaktualizowane. Nowy standard określany jest jako "C99".
  • C99 stał się przestarzały w 2011 roku. Nowy standard jest określany jako "C11".

Odnośnie problemów kompilatora:

  • C89/C90 nie pozwala // komentarzy. Zostały wprowadzone w C99.Nie zostały usunięte w C11.
  • Notacja binarna nigdy nie była częścią żadnego standardu C.

Wniosek:

  • które są najczęściej kompilacji kodu na kompilatora C90, z niektórych niestandardowych rozszerzeń dostępnych.
+0

Dziękuję za odpowiedź. :) – hak8or