Imi poate explica cineva cat mai detaliat posibil cum functioneaza exercitiile acestea?
Fie urmatorul program:
#include
structREGISTRU {
int bit1 : 1;
int : 2;
int bit3 : 4;
int bit4 : 4;
};
int main(void)
{
structREGISTRU bit = { 1, 2, 11 };
printf("%d %d %d\n", bit.bit1, bit.bit3, bit.bit4);
return 0;
}
Ce se afiseaza pe monitor la rulare?
Răspunsuri la întrebare
Răspuns:
#include <cstdio>
struct REGISTRU {
/* operatorul ":" se numește bitfield, practic putem seta o variabilă să ocupe doar un număr de biți în memorie */
int bit1 : 1; /* bit1 va ocupa un bit în memorie, dar fiind signed avem un singur bit pentru semn deci vom avea overflow 100% */
int : 2; /* sincer n-am mai văzut așa ceva până acum :)) */
int bit3 : 4; /* bit3 va ocupa 4 biți în memorie dar fiind un signed int, cel mai semnificativ bit se va ocupa de semnul numărului, restul de 3 se ocupă de stocarea valorii, noi adăugăm 2 în această valoare, valoarea maximă ce poate fi stocată este 7 (2^3 - 1) unde 3 e numărul de biți, 2 < 7 deci e ok, o să afișăm 2 */
int bit4 : 4; /* aceași poveste doar că acum 11 > 7 deci avem un integer overflow, practic acum o să trecem în zona numerelor negative (pentru că încercând să stocăm un număr mai mare decât maximul am schimbat bit-ul de semn), aici sincer nu sunt 100% sigur cum se ocupă C++-ul de asta, ideea e că-i undefined behaviour. Poți citi mai mult pe internet despre ce se întâmplă */
};
int main(void) {
struct REGISTRU bit = {1, 2, 11}; /* -1 2 -5 (se afișează) */
printf("%d %d %d\n", bit.bit1, bit.bit3, bit.bit4);
return 0;
}