Informatică, întrebare adresată de balaniulia, 8 ani în urmă

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 de Apollyon
1

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;

}

Alte întrebări interesante