In sezione 7.18.1.1 paragrafo 1 dello standard C99:Una conversazione int16_t in int genera un comportamento definito dall'implementazione?
Il nome typedef
intN_t
indica un tipo intero con segno Larghezza N, senza imbottitura bit, e la rappresentazione complemento a due.
Secondo lo standard C99, esatto larghezza firmato tipi interi sono tenuti ad avere complemento rappresentazione di un due. Ciò significa che, ad esempio, int8_t
ha un valore minimo di -128
rispetto al valore del complemento del valore minimo di -127
.
Sezione 6.2.6.2 paragrafo 2 permette l'implementazione di decidere se interpretare un po 'segno come segno e la grandezza, complemento a due, o complemento a uno:
Se il segno bit è uno, il valore deve essere modificato in uno dei seguenti modi:
- il valore corrispondente con il bit di segno 0 è negato (segno e grandezza);
- il bit di segno ha il valore - (2 N) (complemento a due);
- il bit di segno ha il valore - (2 N - 1) (un complemento).
Il distinto tra i metodi è importante perché il valore minimo di un numero intero complemento a due (-128
) può essere al di fuori dell'intervallo di valori rappresentabili in complemento quelli (-127
a 127
).
Supponiamo un'implementazione definisce i tipi int
come aventi ones' complement
rappresentazione, mentre il tipo int16_t
ha two's complement
rappresentazione come garantito dallo standard C99.
int16_t foo = -32768;
int bar = foo;
In questo caso, sarebbe la conversione da int16_t
a causa int
implementazione definita comportamento poiché il valore contenuto foo
non rientra nell'intervallo di valori rappresentabili con bar
?
È molto improbabile che un'implementazione abbia 'int16_t' e' int' con una rappresentazione firmata complementare. È la base logica per C per contrassegnare questi tipi interi di larghezza esatta come facoltativi. – ouah
Mi chiedo perché i tipi interi con segno di larghezza esatta abbiano questo requisito esplicito del * complemento * di * piuttosto che lasciarlo all'implementazione come fanno i tipi interi con segno di base. –