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



Teraz jest 1 sty 2025, o 01:18


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 3 maja 2017, o 15:53 
Offline
Użytkownik

Dołączył(a): 01 cze 2012
Posty: 72
Lokalizacja: Gdańsk
Pomógł: 2

Witam.
Mam problem, którego sam nie potrafię rozwiązać.

Gdy użyję takie wyrażenie:
Kod:
uint8_t liczba1 = ~(0xFF);
unsigned char liczba2 = ~(0b11111111);

to w obu przypadkach dostanę warning:
Kod:
warning: large integer implicitly truncated to unsigned type [-Woverflow]

Jeżeli najstarszy bit jest zerowy lub zmienię deklarację zmiennej na większa (np. uint16_t),
Kod:
uint16_t liczba1 = ~(0xFF);
uint8_t liczba2 = ~(0b01111111);

albo
Kod:
uint8_t liczba1 = 0xFF;
uint8_t liczba2 = ~liczba1;

to kompilacja przebiega bez warningów.
Dlaczego tak się dzieje? Tylda(~) to przecież tylko negacja bitowa.

Problem zauważyłem przy lekcji z MultiLED, gdzie chciałem pododawać kropki (SEG_DP) do tablicy ze wzorami cyfr do wyświetlenia. Nie lubię ignorować ostrzeżeń. Proszę o pomoc.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 maja 2017, o 16:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

Poszukaj informacji o DOMYŚLNEJ PROMOCJI DO INT. ;)
np tu. http://atnel.pl/domyslna-promocja-do-typu-int.html

------------------------ [ Dodano po: 3 minutach ]

i tu... też. post186768.html#p186768

------------------------ [ Dodano po: 8 minutach ]

podpowiem że negacja jest liczona "za naszymi plecami" w przejściowym rejestrze o rozmiarze dwóch bajtów. :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 maja 2017, o 17:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

:)
@bartool,
użyj takiego wpisu.
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: 3 maja 2017, o 17:32 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

quartus napisał(a):
A to co za pomysł i w którym to miejscu widać?

Wykładnia:
http://atnel.pl/domyslna-promocja-do-typu-int.html
Burza mózgów:
http://forum.atnel.pl/topic18108.html

Pozdr.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 maja 2017, o 17:40 
Offline
Użytkownik

Dołączył(a): 01 cze 2012
Posty: 72
Lokalizacja: Gdańsk
Pomógł: 2

Dzięki. Nie spodziewałem się tak szybkiej odpowiedzi. :D

O domyślnej promocji do int nawet nie pomyślałem. Zresztą nie wiedziałem, że przy negacji bitowej w ogóle zachodzi taka potrzeba.

Jednak coś mi tu jeszcze nie gra. Tu problemu nie ma:
Kod:
uint8_t liczba1 = 0xFF;
uint8_t liczba2 = ~liczba1;

Ale tu już jest:
Kod:
uint8_t liczba1 = ~(0xFF);

Dlaczego?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 maja 2017, o 20:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

Witam
quartus napisał(a):
‘‘integer promotions’’ require...
... possibly omitting the promotions.

Ja w młodości to tylko j.rosyjski, ale jeśli kolega by mógł to proszę mi przetłumaczyć to:
"large integer implicitly truncated to unsigned type" bo mi łobuz takie coś wypisuje dla
uint8_t m= ~(0xFF)
tzn. co pisze to wiem ale co to znaczy?

Pozdr.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 maja 2017, o 23:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

Witam,
Przyjrzałem się jeszcze raz i odnośnie :
bartool napisał(a):
Jednak coś mi tu jeszcze nie gra. Tu problemu nie ma:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

w linijce nr 1, do zmiennej_1 uint8_t jest wpisana bezpośrednio podana wartość 0b(11111111) = 255.
w linijce nr 2, do zmiennej_2 uint8_t jest obliczana wartość"~", ale z określonego już typu uint8_t.
dlatego jest OK.
bartool napisał(a):
Ale tu już jest:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Tu będzie zastosowane niejawna konwersja , ponieważ 0xff określa wartość(0b11111111)
ale nie określa jakiego typu dotyczy ten zapis (dlatego promocja :)
pomimo że spodziewamy się wyniku uint8_t ).
pozdrawiam.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 3 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