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



Teraz jest 24 lis 2024, o 18:10


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
Autor Wiadomość
PostNapisane: 22 lip 2022, o 14:17 
Offline
Użytkownik

Dołączył(a): 09 lip 2019
Posty: 109
Pomógł: 11

Ostatnio wpakowałem się na ciekawą minę przy pisaniu jednego programu. Doszedłem po chwili o co chodzi, ale pomyślałem, że inne osoby też mogłyby się chwilę pogłowić :-)

Pyanie brzmi - jakie wartości przyjmą zmienne t1 do t7 - i dlaczego niektóre z nich są różne ? ;-)


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: 22 lip 2022, o 15:43 
Offline
Moderator
Avatar użytkownika

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

Już bardzo bardzo dawno temu, jeszcze w czasach pierwszego wydania Bluebooka było to wyjaśniane ;) zajrzyj na mojego bloga

https://atnel.pl/domyslna-promocja-do-typu-int.html

krótko mówiąc - wiedząc co to domyślna promocja to tam gdzie masz dziwne wartości wystarczy albo należy zrobić jawne rzutowanie do uint8_t i po kłopocie

Warto pamiętać o domyślnej promocji w C

_________________
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: 22 lip 2022, o 17:37 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Brak nawiasów w definicji:

#define VAL 1 << 4 | 1 << 5

spowoduje, że wynik operacji:

uint8_t t1 = VAL;
uint8_t t2 = ~t1;

nie będzie taki sam, jak:

uint8_t t5 = ~VAL;

choć teoretycznie powinien być.

Spowodowane jest to brakiem nawiasów w definicji i priorytetami operatorów ("C operator precedence"). Operator negacji bitowej ~ ma wyższy priorytet niż operacja przesunięcia << oraz alternatywa bitowa |
Dlatego ważne jest stosowanie nawiasów w definicjach:

#define VAL (1 << 4 | 1 << 5)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lip 2022, o 19:27 
Offline
Użytkownik

Dołączył(a): 09 lip 2019
Posty: 109
Pomógł: 11

mirekk36 napisał(a):
[...]
krótko mówiąc - wiedząc co to domyślna promocja to tam gdzie masz dziwne wartości wystarczy albo należy zrobić jawne rzutowanie do uint8_t i po kłopocie
[...]

Hehe... też na początku myślałem, że to jest to, ale tym razem rację ma andrews

andrews napisał(a):
Brak nawiasów w definicji:

#define VAL 1 << 4 | 1 << 5
[...]


Gratulacje!

Najśmieszniejsze jest to, że zaczęło się od tego, że pamiętałem o nawiasach, ale przez jakąś pomroczność jasną dałem tyldę wewnątrz nawiasu. Co jeszcze ciekawsze - akurat w tym programie "prawie wszystko" co było potrzebne działało dobrze. Został jeden kontest "zagadka", który robił coś dziwnego... i tak trafiłem na tego babola ;-)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lip 2022, o 19:47 
Offline
Moderator
Avatar użytkownika

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

jak zobaczyłem

#define VAL 1 << 4 | 1 << 5

i później przypisanie z ~ to od razu pomyślałem o domyślnej promocji ;) ale to musiałby być najstarszy bit ustawiany a tu tylko 4ty i 5ty ;) więc skucha

andrews zawsze czujny ! ;) i dobrze prawi

_________________
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: 5 ] 

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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO