2015-05-28 14 views
8

C# ha vari tipi di valore e ognuno ha il proprio scopo. Int32 va da - (0x7FFFFFFF + 1) a 0x7FFFFFFF, e da ogni macchina in cui l'ho mai eseguito, sembra che l'opzione deselezionata ((int) 0xFFFFFFFF) mi abbia sempre ottenuto un valore risultante di -1. È sempre così? Inoltre, .NET rappresenta sempre -1 come 0xFFFFFFFF in memoria su qualsiasi sistema? Il bit principale è sempre il segno? Utilizza sempre la rappresentazione binaria firmata Complemento a due per interi?Il modo in cui C# rappresenta gli interi negativi in ​​memoria e li cancella deselezionati

risposta

8

La documentazione per System.Int32 indica esplicitamente che è memorizzata nel modulo di complimento di due. E 'in fondo:

Oltre a lavorare con i singoli numeri interi come valori decimali, si consiglia di eseguire operazioni bit per bit con valori interi, o lavorare con le rappresentazioni binarie o esadecimali dei valori interi. I valori Int32 sono rappresentati in 31 bit, con il bit di 30 secondi utilizzato come bit di segno. I valori positivi sono rappresentati utilizzando la rappresentazione di segno-e-magnitudine . I valori negativi si trovano nella rappresentazione del complemento di due. È importante tenere presente quando si esegueoperazioni bit a bit sui valori Int32 o quando si lavora con singoli bit . Per eseguire un'operazione numerica, booleana o di confronto su due valori non decimali, entrambi i valori devono utilizzare la stessa rappresentazione .

Quindi sembra che la risposta a tutte le vostre domande sia sì.

Anche l'intervallo per un Int32 proviene da - (0x80000000) a 0x7FFFFFFFF.

2

C# - così come quasi ogni altro 'computer sul pianeta - rappresenta numeri interi nella notazione complemento a 2. Credo che in un punto o in un altro, siano state progettate delle CPU che usavano altre rappresentazioni, ma in questi giorni, si può dipendere in modo affidabile da numeri interi rappresentati nella notazione complemento a 2.

  • contiamo bit da destra a sinistra, con il bit più a destra, il bit 0 è il bit meno significativo ed il bit più a sinistra è il più significativo.

  • il bit di ordine superiore (a sinistra) è il segno: 0 è positivo; 1 è negativo.

  • I bit rimanenti riportano il valore. Ciò significa che il dominio valido di un numero intero di bit N è: (2 n-1) < = x < = + (2 n-1 -1). Vale a dire che è possibile rappresentare un numero negativo in più rispetto a numeri positivi: per un intero con segno a 16 bit, il dominio è compreso tra -32.768 e +32.767.

Per mettere un numero in complemento a due è facile:

  • convertire il suo valore assoluto a binario/base-2 la notazione.
  • se il valore è negativo,
    • invertire i bit
    • aggiungere 1

Quindi, il valore +1 è rappresentato come 0x0001, mentre -1 è rappresentato come

  • 0x0001 (valore assoluto di 1 in binario)
  • 0xFFFE (bit invertiti)
  • 0xFFFF (aggiungere 1)

O 0xFFFF

La ragione per la notazione complemento a due è che rende il design della CPU più semplice: dal momento che la sottrazione è l'aggiunta del negativo (ad esempio 3-2 è uguale a 3 + -2), essi non devono progettare circuiti sottrazione:

  • 1-1 è uguale a 1 + -1 e valuta a zero.

  • o in esadecimale,

    0x0001 (decimal +1) 
    + 0xFFFF (decimal -1) 
        ====== 
        0x0000 (decimal 0) 
    

In più CPU, il riporto dentro o fuori il bit di ordine alto imposta il punto di traboccamento bandiera fisso.

+0

Il bit di ordine superiore non è "il segno", sarebbe una rappresentazione "segno + magnitudine". A complemento a due, il bit di ordine superiore ha un valore di posizione negativo (esattamente -2 volte il valore del bit successivo, quindi è una potenza di -2) –

Problemi correlati