2009-04-01 15 views
5

Recentemente sono stato confuso da this question. Forse perché non ho letto le specifiche del linguaggio (è colpa mia, lo so).Rappresentazioni di compilatori e numeri negativi

C99 standard non indica quale rappresentazione di numeri negativi deve essere utilizzata dal compilatore. Ho sempre pensato che l'unico modo giusto per memorizzare i numeri negativi è il complemento a due (nella maggior parte dei casi).

Quindi, ecco la mia domanda: conoscete un compilatore di oggi che implementa di default la rappresentazione del complemento o della grandezza del segno? Possiamo cambiare la rappresentazione di default con un flag del compilatore?

Qual è il modo più semplice per determinare quale rappresentazione viene utilizzata?

E per quanto riguarda lo standard C++?

+0

Credo che si potrebbe determinare quale implementazione viene utilizzata controllando il binario di un valore con segno per la sua rappresentazione, in modo simile a come i controlli endianness sono fatto. questo potrebbe probabilmente essere fatto in un #define e valutato in fase di compilazione. – slipperyseal

+0

Voglio dire, se non hai risolto questo problema negli ultimi 6 anni. : o – slipperyseal

+0

[Il complemento di uno è un problema del mondo reale, o solo uno storico?] (https://stackoverflow.com/q/161797/995714) –

risposta

5

Penso che non si tratti tanto della rappresentazione utilizzata dal compilatore, ma piuttosto della rappresentazione utilizzata dalla macchina sottostante. Il compilatore sarebbe molto stupido nel selezionare una rappresentazione non supportata dalla macchina di destinazione, poiché ciò introdurrebbe carichi di sovraccarico senza alcun beneficio.

Alcuni campi checksum nella suite di protocolli IP utilizzano il proprio complemento, quindi la CPU del tipo "acceleratore di rete" dedicato è implementabile.

+0

Ci sono dei compilatori C per CPU di tipo "acceleratore di rete"? – klew

+0

@klew: Non che potrei trovare dopo alcuni minuti intensi di ricerca su Google, ma questo non dimostra molto. :) – unwind

1

Mentre la rappresentazione twos-complement è di gran lunga la più comune, non è l'unica (see some). I comitati di standardizzazione C e C++ non volevano richiedere macchine non-twos-complemento per emulare una rappresentazione non nativa. Pertanto, né C né C++ richiedono un formato intero negativo specifico.

Questo porta al comportamento non definito delle operazioni bit a bit sui tipi firmati.

+0

Sì, ma non è quello che sto chiedendo. Conosci qualche compilatore C che per impostazione predefinita userebbe complemet non di due? – klew

+0

Quelli per sistemi che usano il non-tow-complemento ... Che, a quanto pare, include alcuni box Unisys che è ancora supportato (questo potrebbe essere elencato nel secondo link). – Richard

Problemi correlati