[C++] Rappresentazione di valori binari mediante bitmask
Salve a tutti.
Ho visto un video dove si parlava di rappresentazione di bit nella RAM e si mostrava questo codice che consentiva di poter vedere la rappresentazione binaria di un int :
#include
#include
using namespace std;
int main()
{
int i=-3;
unsigned int* s = ( unsigned int*) &i;
cout << *s <
for (int k=0; k<32; k++) //Rappresentazione
if ((*s & 1L<<31-k)>0 ) //mediante
cout << 1; //la
else //tecnica
cout << 0; //del
cout << endl; //bitmask
}
e mi stampa correttamente a video
4294967269 (rappresentazione binaria dei seguenti bit)
11111111111111111111111111100101
ora nella seconda riga di codice viene fatto un casting esplicito che trasforma l'indirizzo della variabile i in un unsigned int*
ed è proprio questa operazione che mi fa codificare il numero come se fosse un intero positivo.
Ora per curiosità ho riscritto il codice così:
#include
#include
using namespace std;
int main()
{
int i=-3;
int* s = ( int*) &i;
cout << *s <
for (int k=0; k<32; k++)
if ((*s & 1L<<31-k)>0 )
cout << 1;
else
cout << 0;
cout << endl;
}
e quando eseguo appare:
-27 (ok era il numero che volevo vedere perché è la rappresentazione in complemento a 2 di 11111111111111111111111111100101)
01111111111111111111111111100101
Adesso mi chiedo perché quella sequenza di bit comincia con quello zero ? Nella codifica in complemento a 2 una sequenza che inizia per zero rappresenta un numero positivo , quindi usare un int* al posto di un unsigned int* è sbagliato se si vuole rappresentare un un numero in binario . Qualcuno potrebbe spiegarmi il perché di questo (e anche il significato di quello zero) ?
Ho visto un video dove si parlava di rappresentazione di bit nella RAM e si mostrava questo codice che consentiva di poter vedere la rappresentazione binaria di un int :
#include
#include
using namespace std;
int main()
{
int i=-3;
unsigned int* s = ( unsigned int*) &i;
cout << *s <
if ((*s & 1L<<31-k)>0 ) //mediante
cout << 1; //la
else //tecnica
cout << 0; //del
cout << endl; //bitmask
}
e mi stampa correttamente a video
4294967269 (rappresentazione binaria dei seguenti bit)
11111111111111111111111111100101
ora nella seconda riga di codice viene fatto un casting esplicito che trasforma l'indirizzo della variabile i in un unsigned int*
ed è proprio questa operazione che mi fa codificare il numero come se fosse un intero positivo.
Ora per curiosità ho riscritto il codice così:
#include
#include
using namespace std;
int main()
{
int i=-3;
int* s = ( int*) &i;
cout << *s <
if ((*s & 1L<<31-k)>0 )
cout << 1;
else
cout << 0;
cout << endl;
}
e quando eseguo appare:
-27 (ok era il numero che volevo vedere perché è la rappresentazione in complemento a 2 di 11111111111111111111111111100101)
01111111111111111111111111100101
Adesso mi chiedo perché quella sequenza di bit comincia con quello zero ? Nella codifica in complemento a 2 una sequenza che inizia per zero rappresenta un numero positivo , quindi usare un int* al posto di un unsigned int* è sbagliato se si vuole rappresentare un un numero in binario . Qualcuno potrebbe spiegarmi il perché di questo (e anche il significato di quello zero) ?
Risposte
Devo fare una correzione : subito dopo il main il valore della variabile i è in entrambi i casi -27.
Ancora non riesco a capire perché nella rappresentazione binaria nel' esempio del signed compare quello zero inizale.
Ancora non riesco a capire perché nella rappresentazione binaria nel' esempio del signed compare quello zero inizale.
"jack ishimaura":
subito dopo il main il valore della variabile i è in entrambi i casi -27.
Boh, io ho eseguito il primo programma e ha stampato 4294967293 (corretto, poichè *s è interpretato come unsigned).
Poi ho eseguito il secondo programma e ha stampato -3 (corretto, poichè *s è interpretato come signed).
Inoltre, c'è un errore nell'operazione di bitwise
if ((*s & 1L<<31-k)>0 )
Quando *s è interpretato come signed, *s & (1<<31) è un numero negativo, quindi la condizione è falsa (questo è il motivo per cui il secondo programma stampa 0 in posizione più significativa). In effetti, la condizione corretta è
if ((*s & 1L<<31-k) != 0 )
Grazie mille
