Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 27 lut 2026, o 04:11


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 20 ] 
Autor Wiadomość
PostNapisane: 19 sty 2014, o 20:18 
Offline
Użytkownik

Dołączył(a): 20 gru 2013
Posty: 28
Pomógł: 0

Co oznacza w języku C takie działanie zmienna "u" typu int8_t
Kod:
u*=-1;
wiem, że zapis jest równoznaczny
Kod:
u=u* (-1);
chodzi o tą -1 co ona daje skoro liczba jest jednobajtowa czyli od 0-255.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sty 2014, o 20:23 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

mlp napisał(a):
chodzi o tą -1 co ona daje skoro liczba jest jednobajtowa czyli od 0-255.


widzisz - jednak warto zacząć naukę C od podstaw a nie od środka .... a podstawa to nauka typów na przykład.

Gdybyś o nich poczytał to zobaczyłbyś że

int8_t

to zakres od -128 do +127

a więc już chyba rozumiesz że jednak mnożenie przez -1 daje nam coś wymiernego ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sty 2014, o 21:04 
Offline
Użytkownik

Dołączył(a): 20 gru 2013
Posty: 28
Pomógł: 0

a tak racja int8_t a nie uint8_t no dobrze tylko, że wykorzystuję to działanie do ustawiania rejestrów liczników w pwm
Kod:
ISR(TIMER0_COMP_vect) {


   //zmiana kierunku pwm
   if(OCR1A==250 || OCR1A==0)  pwm=pwm* (-1) ;


   OCR1A+=pwm;  //zmienia współczynniki wypełnienia pwm
   OCR1B-=pwm;

}


zmienna "pwm" na początku programu ma wartość =1 czyli podczas wykonywania przerwania w OCR1B będzie wpisana wartość ujemna, czy w tych rejestrach może być wartość ujemna, co to daje ?
Program działa OK tylko mam problem ze zrozumieniem tego.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sty 2014, o 21:22 
Offline
Użytkownik

Dołączył(a): 27 mar 2012
Posty: 511
Lokalizacja: Sląsk
Pomógł: 14

Tu się kłania system kodowania liczb ujemnych. Zapomniałem jak to się nazywa ale chyba ostatni bit czyli najstarszy określa ten minus. Raczej się nie stosuję zapisu liczb ujemnych do rejestrów. Może ktoś inny lepiej to wytłumaczy :)

_________________
Programowanie to styl życia :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sty 2014, o 21:26 
Offline
Użytkownik

Dołączył(a): 20 gru 2013
Posty: 28
Pomógł: 0

Tak tego właśnie nie rozumiem będzie to w zapisie bit znaku-moduł liczby ale jak to rozumieć w odniesieniu do tych rejestrów.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sty 2014, o 21:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

A co to znaczy liczba ujemna w zapisie binarnym? Poczytaj sobie o zapisie liczb w systemie uzupełnień do dwóch to ci się dużo wyjaśni.

Tak w skrócie to w tym systemie liczba jest traktowana jako ujemna jeśli jej najstarszy bit ma wartość 1.
To oznacza, że zmienna typu int8_t 0b10000000 będzie traktowana jako -128, ale jeśli ta zmienna będzie typu uint8_t to już będzie traktowana jako 128.

Liczba -1 binarnie ma postać 0b11111111. I jeśli tą liczbę będziemy rzutować na zmienną typu uint8_t to ta zmienna będzie miała wartość 255.

Więc wydaje mi się że jeśli do jakiegoś rejestru 8 bitowego będziemy chcieli zapisać liczbę np -1 to nastąpi rzutowanie (chyba niejawne) typu int8_t na typ uint8_t i w efekcie końcowym w tym rejestrze znajdzie się liczba 255.
Niech mnie ktoś poprawi jeśli się mylę.

A tak w ogóle to co za problem wziąć procek, wyświetlacz LCD i zobaczyć co znajdzie się w zmiennej uint8_t albo w jakimś rejestrze po wpisaniu do niej liczby ujemnej.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sty 2014, o 21:43 
Offline
Użytkownik

Dołączył(a): 27 mar 2012
Posty: 511
Lokalizacja: Sląsk
Pomógł: 14

jacekk232 jak liczba -1 może mieć w systemie dwójkowym same jedynki??
Nie znam się dokładnie jak to jest, ale jeśli bym pisał źle to niech mnie ktoś poprawi :)
Mi się wydaje że jest to tak:
Mamy przykładowo liczbę "4" zapisaną jako int8_t ma ona zapis binarnie 00000100 gdy pomnożymy ją przez (-1) to uzyskamy -4 jako int8_t czyli binarnie 10000100 gdy chcielibyśmy ją zapisać do rejestru to w takim rejestrze wpisała by się liczba 132 jako uint8_t gdyż taka kombinacja binarnie jej odpowiada.
Mam nadzieje że dobrze to napisałem.

_________________
Programowanie to styl życia :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sty 2014, o 21:53 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

zapis w rejestrze nie może być ujemny ;) bo procek nie wie co to liczby ujemne - procek wie co to liczby binarne i całkowite ...

typy danych to coś nadrzędnego i już my ludzie się nimi posługujemy ... procek tylko operuje na liczbach całkowitych - tyle że kompilator korzysta tu z "kodu uzupełnień do dwóch" .. warto o tym poczytać

http://pl.wikipedia.org/wiki/Kod_uzupe% ... dw%C3%B3ch

Janadamis napisał(a):
jacekk232 jak liczba -1 może mieć w systemie dwójkowym same jedynki??


może może - również poczytaj o kodowaniu U2 zobaczysz wtedy jak to jest

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sty 2014, o 21:54 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Janadamis napisał(a):
jak liczba -1 może mieć w systemie dwójkowym same jedynki??

Ano może mieć bo zamieniając jakąś liczbę na ujemną to trzeba zanegować jej wszystkie bity i dodać do niej jeden.
Liczba 1 w naturalnym kodzie binarnym ma postać 0b00000001 co po zanegowaniu daje 0b11111110. Dodajemy jeden i mamy 0b11111111 czyli -1 w kodzie U2.

mirekk36 napisał(a):
zapis w rejestrze nie może być ujemny ;) bo procek nie wie co to liczby ujemne - procek wie co to liczby binarne i całkowite ...

Czyli teoretycznie po zapisaniu do jakiegoś rejestru liczby -1 czyli 0b11111111 procek potraktuje to jakby w tym rejestrze była liczba 255.

Asemblera znam bardzo słabo ale zajrzałem do pliku lss by zobaczyć jak kompilator przetłumaczy zapis do rejestru DDRB liczbę 255 i -1. Na moje to wygląda, że zapisze to samo czyli liczbę 255.
Składnia: [ Pobierz ] [ Ukryj ]
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Ostatnio edytowano 19 sty 2014, o 22:07 przez jacekk232, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sty 2014, o 22:01 
Offline
Użytkownik

Dołączył(a): 20 gru 2013
Posty: 28
Pomógł: 0

więc chyba w ten sprytny sposób po doliczeniu do 255 wartość bufora licznika zaczyna się od początku tak mi się wydaje ale nie jestem pewny, wtedy nie trzeba sprawdzać warunków.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sty 2014, o 22:13 
Offline
Użytkownik

Dołączył(a): 27 mar 2012
Posty: 511
Lokalizacja: Sląsk
Pomógł: 14

Czyli byłem w błędzie. Ale już kojarzę o co chodzi.

_________________
Programowanie to styl życia :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sty 2014, o 22:15 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

jacekk232 napisał(a):
Czyli teoretycznie po zapisaniu do jakiegoś rejestru liczby -1 czyli 0b11111111 procek potraktuje to jakby w tym rejestrze była liczba 255.


dokładnie tak ;) ... pomyśl sobie to czy 255 jest dla nas liczbą 255 czy -1 zależy TYLKO i wyłącznie od typu zmiennej ... po to są typy.

Więc jeśli wpiszemy w rejestr liczbę 255, czyli

Kod:
rejestr = 255;


i teraz zdefiniujemy dwie zmienne

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


to teraz warunek

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


natomiast

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


czyli widać teraz że zależy to tylko od tego jak kompilator postrzega te zmienne i tak sobie układa kod

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sty 2014, o 22:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

No to w ramach relaksu mała zagadka :-)
Mamy jakąś zmienną
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Jaki będzie wynik takiego działania
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sty 2014, o 22:29 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

żaden, kompilator zgłosi błąd

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sty 2014, o 22:41 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

MirkoT napisał(a):
żaden, kompilator zgłosi błąd


Na pewno nie zgłosi błędu ;) ... warto pomyśleć jeszcze .... na pewno będzie jakiś wynik .... jacek zadał dobrą zagadkę - jak ktoś ją rozwiąże sobie to do końca praktycznie zrozumie o co chodzi z tymi liczbami ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sty 2014, o 22:50 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

skoro nie zgłosi błędu to otrzymamy 251

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sty 2014, o 22:56 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

Też tak sądzę: 251

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sty 2014, o 22:59 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

i bardzo dobrze - bo 251 to w kodzie uzupełnień do dwóch U2 = -5 ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sty 2014, o 20:19 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

mirekk36 napisał(a):
i bardzo dobrze - bo 251 to w kodzie uzupełnień do dwóch U2 = -5

No właśnie o to mi chodziło żeby pokazać, że w procku wszystkie liczby są zapisane za pomocą zer i jedynek. A czy te liczby będą dodatnie czy ujemne to zależy od tego jak kompilator to zinterpretuje.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sty 2014, o 21:12 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

Cytuj:
No właśnie o to mi chodziło żeby pokazać, że w procku wszystkie liczby są zapisane za pomocą zer i jedynek. A czy te liczby będą dodatnie czy ujemne to zależy od tego jak kompilator to zinterpretuje.


I strzeliłeś z taką zagadką w tzw dziesiątkę ;) bo lepiej chyba nie można było tego wyjaśnić ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 20 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO