On Tuesday, November 20, 2012 5:54:23 PM UTC+1, enoquick wrote:
> Il 20/11/2012 10:17,
fma...@gmail.com ha scritto:
> > Faccio reply qui ma è un'osservazione più generale.
> > Non capisco il perché di tutto questo discorso.
> > Per quanto mi riguarda:
> > se dichiaro una variabile unsigned devo assegnare un valore unsigned, punto.
> > Se questo, da qualche parte, non succede, c'è un errore logico nel codice, e
> > va sistemato! Questo considerando anche che, se voglio qualcosa di particolare,
> > ci sono funzioni specifiche per ottenere lo stesso risultato in maniera pulita,
> > comprensibile e portabile.
> > Conoscere quello che fa il proprio compilatore in quello specifico caso,
> > quindi, è inutile!
> > Ciao!
>
> Il discorso è semplice
> L' amico Neonano aveva affermato che assegnare un numero negativo ad un
> unsigned era un risultato imprevedibile.
> Ho fatto osservare che lo std prevede alcuni comportamenti da parte del
> compilatore perfettamente prevedibili e questo era uno di quei casi,
> tutto qua.
>
> Tu consideri assegnare un numero negativo ad unsigned una cosa da non
> fare, ma invece questo è un ragionamento che può avere un senso in un
> linguaggio che è un assembler portabile e se ragioni a livello di bit e
> bytes
> Es:
> unsigned mask = -1;
> Dal mio punto di vista crea una maschera di bit tutti a 1, perfettamente
> logico.
> Ok, lo puoi fare anche cosi:
> unsigned mask = 0xFFFFFFFF;
> Ma questo non è portabile perchè assumi che un unsigned sia di 4 bytes.
> Ed ecco che assegnare -1 ad un unsigned è un modo per rendere il codice
> indipendente dalla size dell' unsigned quindi portabile e che assume un
> ben preciso significato logico se si ragiona in termini di bit.
>
E' questione di gusti..
Quello che dici di solito si fa con -1 perché funziona sempre, mentre cose come:
unsigned long v = ~0u;
oppure
unsigned int v = ~0;
non funzionano sempre (il primo per il numero di bit (int può avere meno bit di
long), il secondo per la rappresentazione (non è detto che sia in complemento
a due)).
Sinceramente quando programmo codice che usa maschere (e quindi, di riflesso,
che mi aspetto sia portabile su più piattaforme "risicate") mi definisco in
un .h i tipi e le maschere con dei typedef e delle define così come mi aspetto
per ogni macchina target (e il target va specificato in compilazione! ;)) e uso
quelle nel codice: in questo modo racchiudo la "logica macchina" in un file e
posso usare la "logica umana" (quella che descrivevo prima, unsigned con
unsigned, signed con signed) in tutti gli altri moduli.
Ciao!