avr-gcc unsigned char

May 25, 2006 17 Replies

Witam.



Dlaczego jak zdefiniujê zmienn± typu unsigned char zm = 128; to w programie wynosi ona 0? A jak wpiszê 129 to ma 1. Tak jakby najwiêksza jej warto¶æ to 127. Czy to jaki¶ nowy standard?



Jakiego typu u¿yæ ¿eby mieæ osiem bitów bez znaku?



Dziêki za pomoc Pawe³



W pêtli for mrygam lampk± tyle razy jaka jest liczba.

unsigned char zm, i;

zm = 130;

for(int i = 0; i < zm; i++) mrygaj;

Dla zmiennych poni¿ej 128 dzia³a dobrze.

Pawe³

Sorry oczywi¶cie w programie jest bez int i tylko samo i. for(i = 0; i < zm; i++)

Pawe³

Użytkownik Paweł napisał:

Coś kolega opuścił. Skąd wiadomo że jest równe 0 lub 1 ? Z printfa ? Z debugera ?

unsigned char

Ależ proszę.

Adam

^^^ a to co?

Ja się nie znam ale chyba typ zmiennej sterującej w pętli też jest ważny...

U¿ytkownik "Pawe³" snipped-for-privacy@poczta.onet.pl> napisa³ w wiadomo¶ci news:e5446u$nra$ snipped-for-privacy@news.onet.pl...

Problem jest chyba w porownaniu i< zm. Poniewaz "i" jest typu int a "zm" typu unsigned char to byc moze domyslnie obie sa kastowane na typ int.

Jednak to chyba nie wyjasnia dlaczego gdy zm=128 to miga 1 raz bo 128 to jest -128 jeesli interpretowac ze znakiem.

Użytkownik Paweł napisał:

Powinno działać ,ale może kompilator jakieś promocje robi samoistnie, bo to chyba raczej nie na pecka.

Możesz spróbować : zm = (unsigned char ) 130;

Daj znać.

Adam

Dnia 25.05.2006 Paweł snipped-for-privacy@poczta.onet.pl> napisał/a:

Ja namietnie uzywam zmiennej typu uint8_t

AW

Thus wrote Górski Adam <gorskia@.................wp....................pl..................>:

Zgodnie z odwieczną specyfikacją języka ma obowiązek promować char na int.

Paweł

Slusznie, jednak w AVR-GCC typ ten najpewniej powstaje tak:

typedef unsigned char uint8_t;

Sprawdz w types.h :).

snipped-for-privacy@wp.pl napisał(a):

Akurat te standardowe typy leżą w inttypes.h (ew. stdint.h)

Nie wazne gdzie, wazne ze dziala ;-)

A po co w ogole to tak jest zrobione?

AW

looknalem do GMUARM-a ;). Widocznie tu jest inaczej

jesli unsigned char z jakich tajemniczych powodow sprawia autorowi problem, to uint8_t zefiniowany tak jak napisalem tez bedzie :)

Glownie po to, aby uniezaleznic sie od platformy. Nie ma reguly, ze unsigned int jest np. 16-bitowy, choc na niektorych platformach wlasnie tak jest. W ARM7 bedzie 32-bitowy itp. itd. unsigned char niemal wszedzie jes 8 bitowy, ale 8-bitowosc to nie jest jego cecha przyrodzona :). Jesli wiec cecha typu ma byc jego dlugosc bitowa, to stosuje sie takie podejscie. Na innej platformie latwo to zmienic - wystarczy podmienic plik z definicjami typow i nie trzeba zmieniac calego programu.

Thus wrote snipped-for-privacy@wp.pl:

Z tym tylko, że tam, gdzie char nie jest ośmiobitowy nie znajdzie się ośmiobitowego typu wcale -- bo standard języka narzuca, że char ma się mieścić w pojedyńczym bajcie (który zazwyczaj jest ośmiobitowy, ale...).

Paweł

Paweł napisał(a):

A czasem kod mrygania nie jest skopany? Nie podałeś go. Moze mrygaj to zmiana stanu lampki i bedzie taki efekt właśnie?!

Paweł napisał(a):

mysle ze chyba to to: jedyny blad jaki zrobiles to "int" po for. na poczatku programu deklarujesz zmienna unsigned, czyli od 0 do 255 a potem w forze deklarujesz ja jako int czyli od 0 do 127. ale to jest smieszne poniewaz powinien zadeklarowac od 0 do 32767, przynajmniej tak jest w C, nie wiem jaki masz jezyk programowania, ale to powinno pomoc

Dnia Thu, 25 May 2006 11:32:04 +0200, Paweł napisał(a):

Gdyby było z int stawiałbym na opcję -mint8 przy kompilacji :)

Pozdrawiam Marcin Stanisz

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required