C tratta le costanti esadecimali (ad esempio 0x23FE) e int signed o unsigned?Costante esadecimale senza segno in C?
Amr
C tratta le costanti esadecimali (ad esempio 0x23FE) e int signed o unsigned?Costante esadecimale senza segno in C?
Amr
Il numero stesso è sempre interpretata come un numero non negativo. Le costanti esadecimali non hanno un segno o alcun modo intrinseco per esprimere un numero negativo. Il tipo di costante è il primo di questi che può rappresentare il loro valore:
int
unsigned int
long int
unsigned long int
long long int
unsigned long long int
E li tratta come int
letterali (fondamentalmente, come int firmato!). Per scrivere un letterale senza segno sufficiente aggiungere u
alla fine:
0x23FEu
Non credo che si possa lasciare questa affermazione come tale. E.g a condizione che la larghezza di 'int' sia a 32 bit il valore' 0x8000' è 'unsigned' (ovvero' INT_MAX + 1') e non 'signed' (e' INT_MIN'). –
@JensGustedt: Presumibilmente vuoi dire che se la larghezza di 'int' è ** 16 ** bit allora' 0x8000' sarà 'unsigned'? –
@Charles, probabilmente. Il conteggio dei bit non è mai stato il mio punto di forza :) –
Mi manca l'esperienza per dichiararlo corretto, ma ha più senso dell'altra risposta. – delnan
Nota che, di conseguenza, 0x8000 può essere firmato o non firmato a seconda che sizeof (int) sia 2 o 4. Yuck! Basta aggiungere 'u' se hai davvero bisogno di' unsigned'. – anatolyg
@anatolyg: Non sono sicuro di cosa intendi per "schifo". Sarà sempre positivo e convertirà sempre al valore corretto se assegnato o promosso ad un altro tipo in cui il valore è ancora nel range che mi sembra un comportamento abbastanza ragionevole e desiderabile. –