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 <cstdio>
#include <iostream>
using namespace std;
int main()
{
int i=-3;
unsigned int* s = ( unsigned int*) &i;
cout << *s <<endl;
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 <cstdio>
#include <iostream>
using namespace std;
int main()
{
int i=-3;
int* s = ( int*) &i;
cout << *s <<endl;
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) ?