Pytanie o Uniie

Język C dla mikrokontrolerów ARM
ODPOWIEDZ
procek87
Nowy
Posty: 3
Rejestracja: 09 lis 2017, 21:26

Pytanie o Uniie

Post autor: procek87 » 12 maja 2018, 13:59

Witajcie nie wiedziałem do którego działu wrzucić to zapytanie , jeśli to nie tu to skorygujcie.

Wielu z was nazywa w języku c unię, konwerterem pytanie czy konwerter z dużych typów na mniejsze ?
To co zmienna 4 bajtowa zawiera w jej najmłodszym bajcie odzwierciedla się wyżej w mniejszych?

Obrazek

Czy może na odwrót to co w jedno-bajtowych typach ląduje w tym większym 4 bajtowym ?
Co jeśli jeden typ jedno-bajtowy będzie zawierał liczbę dziesiętne 65 a kolejny pod nim 26, to jaka liczba trafi do najmłodszego bajtu w typie 4 bajtowym ?

Obrazek

Jeśli się mylę to proszę o nakierowanie mnie Dziękuje procek

PS: "próbuje zrozumieć"

Awatar użytkownika
Marhef
Użytkownik
Posty: 15
Rejestracja: 15 lis 2017, 0:05
Lokalizacja: Kraków
Kontakt:

Re: Pytanie o Uniie

Post autor: Marhef » 12 maja 2018, 22:34

Moim zdaniem:
- jeśli "włożysz" do unii wartość 4-bajtową, to możesz odczytać zmienną 1-bajtową i będzie to najmniejszy bajt - czyli tak, jak na pierwszym obrazku
- jeśli "włożysz" wartość 1-bajtową, to możesz odczytać 4 bajty. Z tym, że na trzech bajtach będą poprzednie wartości (czyli wartości sprzed zapisu 1 bajta)
- nie możesz odczytać dwóch bajtów (np. ostatniego i przedostatniego) za pomocą dwóch zmiennych jednobajtowych. Używając zmiennej 1-bajtowej odczytasz zawsze ostatni bajt

Co do pytania:
procek87 pisze:
12 maja 2018, 13:59
Czy może na odwrót to co w jedno-bajtowych typach ląduje w tym większym 4 bajtowym ?
Co jeśli jeden typ jedno-bajtowy będzie zawierał liczbę dziesiętne 65 a kolejny pod nim 26, to jaka liczba trafi do najmłodszego bajtu w typie 4 bajtowym ?

Obrazek
Do najmłodszego bajtu trafi wartość, którą zapiszesz jako ostatnią.
Jeśli w jednej linijce kodu zapiszesz wartość 65, a w kolejnej 26, to w unii będzie wartość 26. Bo tą wartością nadpiszesz wartość 65 (mam nadzieję, że nie namieszałem)

Awatar użytkownika
SunRiver
Administrator
Posty: 400
Rejestracja: 08 paź 2017, 11:27
Lokalizacja: Opole
Kontakt:

Re: Pytanie o Uniie

Post autor: SunRiver » 12 maja 2018, 22:44

Dokładnie tak będzie (jak obrazuje kol Marhef) gdyż unia tak właśnie działa ...
służy jako konwerter różnych typów zmiennych , a nie jako magazyn na zmienne takie są realia ...

------------------

chodzi o to że zaoszczędzisz miejsce jak bedziesz chciał trzymać char, int , ...
bo dostaniesz dostęp do róznych typów zmiennych jeśli jest taka potrzeba , ale jeśli wrzucisz 2 inty to odczytasz zawsze ten ostatni
gdyż on nadpisze pierwszy ...

ale można sobie z tym poradzić gdy uzyjesz struktury jako elementu unii :)
.... z każdym bitem serca ....
💫SunDUINO
💦Google+
💦Kanał Youtube
💦Sotton

procek87
Nowy
Posty: 3
Rejestracja: 09 lis 2017, 21:26

Re: Pytanie o Uniie

Post autor: procek87 » 13 maja 2018, 8:39

Dziękuje za odpowiedz sunriver i marhef " kto pyta nie błądzi" ;)

mam jeszcze jedno pytanie w kodzie trochę inaczej to funkcjonuje niż na obrazku poglądowym.

Skąd mam wiedzieć czy ostatnia zmienna to a czy b i którą ostatecznie do tej komórki zapisze ?

Obrazek

bo może do komórki trafić 65 i 32 która będzie na dole skoro w definicji unii można zapisać tak :
  1. union {
  2.  
  3.        uint8_t a;
  4.        uint8_t b;
  5.  
  6.       uint8_t tab1[2];
  7.  
  8.   }konw;


ale równie dobrze można też tak :

  1. union {
  2.  
  3.        uint8_t b;
  4.        uint8_t a;
  5.        
  6.  
  7.       uint8_t tab1[2];
  8.  
  9.   }konw;

Awatar użytkownika
Marhef
Użytkownik
Posty: 15
Rejestracja: 15 lis 2017, 0:05
Lokalizacja: Kraków
Kontakt:

Re: Pytanie o Uniie

Post autor: Marhef » 13 maja 2018, 14:40

Ale unia to nie struktura. Nieważne, jak masz zapisane w deklaracji. W unii będzie ta wartość, którą zapiszesz jako ostatnią w kodzie

Awatar użytkownika
Daro69
Nowy
Posty: 2
Rejestracja: 18 paź 2017, 7:33
Lokalizacja: Warszawa

Re: Pytanie o Uniie

Post autor: Daro69 » 14 maja 2018, 0:21

witam,
procek87 pisze:
13 maja 2018, 8:39
Skąd mam wiedzieć czy ostatnia zmienna to a czy b
hmm...
problem w tym że trzeba sobie uświadomić, że unia to nakładające się na siebie zmienne.
można w niej zapisać np:
uint8_t a;
uint8_t b;
uint8_t tab[2];

zarówno a i b zajmują tę samą część unii.(8 -najmłodszych bitów "dokładnie pokrywają się - nadpisują osiem najmłodszych bitów")
czyli to co zawiera " tab[0]; "
natomiast tab[1] można zmieniać zapisując do unii uint16_t c;
osiem starszych bitów tej zmiennej 'c' , będzie nadpisywało się wzajemnie z tab[1];

procek87
Nowy
Posty: 3
Rejestracja: 09 lis 2017, 21:26

Re: Pytanie o Uniie

Post autor: procek87 » 15 maja 2018, 7:01

Dziękuje wam bo w końcu zrozumiałem jeszcze raz Dziękuję. ;)

ODPOWIEDZ