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
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.
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.
- 1. Rappresentazione di numeri negativi in C?
- 2. Espressione regolare per confrontare gli interi non negativi in PHP?
- 3. interi non negativi
- 4. grandi letterali interi negativi
- 5. Qual è il miglior modo C++ per moltiplicare in modo modulare gli interi senza segno?
- 6. Come convertire numeri interi negativi in binario in Ruby
- 7. Come moltiplicano gli interi in C++?
- 8. Come calcolare il modulo degli interi negativi in JavaScript?
- 9. Come moltiplicare il float con gli interi in C?
- 10. Gli indici di array negativi sono consentiti in C?
- 11. Rilevazione degli interi negativi usando operazioni bit
- 12. Come convertire gli interi negativi in stringhe in SML con segno meno invece di tilde?
- 13. C++ cancella vettore, oggetti, memoria libera
- 14. Come gestire gli allineamenti della memoria e l'aritmetica dei puntatori generici in modo portatile in C?
- 15. In che modo C++ memorizza funzioni e oggetti in memoria?
- 16. Come si cancella la memoria in Javascript?
- 17. Come implementare gli indici negativi in java?
- 18. Quando devono essere specificati in modo esplicito gli interi?
- 19. Concatena gli interi in un array?
- 20. Programma C per confrontare gli interi senza utilizzare operatori logici?
- 21. Leggere gli interi binari
- 22. Che cosa rappresenta la classe [B rappresenta in Java?
- 23. Un po 'di confusione con il modo in cui le virgole funzionano in C/C++
- 24. In che modo Java gestisce gli oggetti stringa in memoria?
- 25. HashMap non fornisce valori nell'ordine in cui li ha aggiunti
- 26. Perché gli interi sono immutabili in Python?
- 27. Come si tracciano i dati bidimensionali nei cerchi in cui il raggio rappresenta la 3a colonna e il colore rappresenta la 4a colonna?
- 28. Come si rappresenta una griglia hextile/hex in memoria?
- 29. In MVC, un ORM rappresenta il modello?
- 30. Esistono implementazioni di interi interi solidi in C?
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) –