[C++] Rappresentazione di valori binari mediante bitmask

Messaggioda jack ishimaura » 19/04/2018, 19:41

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) ?
jack ishimaura
Junior Member
Junior Member
 
Messaggio: 38 di 104
Iscritto il: 01/08/2017, 18:44

Re: [C++] Rappresentazione di valori binari mediante bitmask

Messaggioda jack ishimaura » 03/08/2018, 12:10

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.
jack ishimaura
Junior Member
Junior Member
 
Messaggio: 41 di 104
Iscritto il: 01/08/2017, 18:44

Re: [C++] Rappresentazione di valori binari mediante bitmask

Messaggioda Albesa81 » 09/08/2018, 13:34

jack ishimaura ha scritto: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
Codice:
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 è
Codice:
if ((*s & 1L<<31-k) != 0 )
Albesa81
Junior Member
Junior Member
 
Messaggio: 129 di 341
Iscritto il: 21/12/2010, 12:02

Re: [C++] Rappresentazione di valori binari mediante bitmask

Messaggioda jack ishimaura » 10/08/2018, 17:16

Grazie mille :smt023
jack ishimaura
Junior Member
Junior Member
 
Messaggio: 42 di 104
Iscritto il: 01/08/2017, 18:44


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite