Domanda

Lo standard ISO C consente tre metodi di codifica per gli interi firmati:. Complemento a due, complemento a uno e segno / ampiezza

Qual è un modo efficiente o buono per rilevare la codifica in fase di esecuzione (o qualche altro tempo se c'è una soluzione migliore)? Voglio sapere questo in modo da poter ottimizzare una libreria bignum per le diverse possibilità.

ho intenzione di calcolo di questo e la memorizzazione in una variabile ogni volta che il programma viene eseguito in modo che non ha bisogno di essere veloce come il fulmine - Sto assumendo la codifica non cambia durante l'esecuzione del programma: -)

È stato utile?

Soluzione

Non vi resta che controllare i bit di ordine basso della costante -1 con qualcosa di simile -1 & 3. Questo restituisce

  1. per il segno e la grandezza,
  2. per un complemento e
  3. per complemento a due.

Questo dovrebbe anche essere possibile fare in un'espressione preprocessore all'interno costrutti #if #else.

Altri suggerimenti

Rilevazione complemento a uno dovrebbe essere abbastanza semplice - qualcosa come if (-x == ~x). Rilevamento complemento a due dovrebbe essere solo circa facile: if (-x == ~x + 1). Se si tratta di nessuno di questi, allora deve essere segno / grandezza.

Perché non farlo al momento della compilazione? Si potrebbe avere il makefile di compilazione di un programma script di build / test se necessario, ma poi usa il preprocessore di fare compilazione condizionale. Questo significa anche performance è molto meno importante, perché si corre una sola volta per la compilazione, piuttosto che una volta per ciclo.

Recupera un puntatore ad un int che avrebbe mostrato un po '-modello distintivo. Lanciarlo come un puntatore a unsigned int e quindi esaminare i valori dei bit.

In questo modo con un paio di valori scelti con cura dovrebbe fare quello che vuoi.

Credo che ci si memorizza un numero negativo come int in un array di char abbastanza grande da contenere e confrontare la matrice con le varie rappresentazioni di scoprire.

Ma Uhm ... non firmato interi non dovrebbero avere un segno, no?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top