2013-07-05 23 views
12

Uso l'operazione ~ per la manipolazione dei bit e mi chiedo come Java calcola il numero negativo?In che modo Java calcola i numeri negativi?

ho controllato la documentazione Java:

"L'operatore complemento bit a bit unario '~' inverte una sequenza di bit, ma può essere applicato a qualsiasi tipo integrale, rendendo ogni '0' a '1' e ogni "1" a "0" .Ad esempio, un byte contiene 8 bit, applicando questo operatore a un valore il cui modello di bit è "00000000" cambierebbe il suo modello in "11111111". "

Quindi se int a = 60 (0011 1100), quindi int c = ~a (1100 0011).

La domanda è, come Java calcola i numeri negativi in ​​modo che 1100 0011 = -61? L'unico modo 1100 0011 è calcolato -61 è

  1. il bit più alto è il bit del segno.
  2. -2^6 + 2^1 + 2^0 = -61.

Ma questo non ha senso per me.

+3

È Sei sulla strada giusta con il bit più alto che è il bit del segno. Per favore vedi [Complemento di due] (http://en.wikipedia.org/wiki/Two's_complement). Il bit firmato – rgettman

+0

viene utilizzato per double e float, il che significa che si hanno 0.0 e -0.0, gli interi non vengono eseguiti in questo modo e 'char' non è firmato. –

risposta

12

Il presupposto che il bit più alto è un semplice bit . Java, così come i più moderni linguaggi di programmazione (e architetture hardware) usano la cosiddetta rappresentazione two's complement per i numeri. (Il bit stesso, per coincidenza, indica il segno, ma non nel modo in cui ci si aspetterebbe, cioè 150 e -150 hanno più differenze rispetto al bit del segno nella loro rappresentazione.)

Questa rappresentazione potrebbe sembrare una scelta strana all'inizio, ma in realtà rende le operazioni come l'aggiunta di un numero positivo a un numero negativo (o variazioni di questo) automagicamente funzionanti, senza che il processore debba verificare casi speciali.

Secondo the relevant Wikipedia article:

Il sistema è utile per semplificare l'implementazione di aritmetica su hardware del computer. Aggiungere 0011 (3) a 1111 (-1) all'inizio sembra dare la risposta errata di 10010. Tuttavia, l'hardware può semplicemente ignorare il bit più a sinistra per dare la risposta corretta di 0010 (2). I controlli di overflow devono ancora esistere per intercettare operazioni come sommare 0100 e 0100. Il sistema consente quindi l'aggiunta di operandi negativi senza un circuito di sottrazione e un circuito che rileva il segno di un numero. Inoltre, quel circuito di addizione può anche eseguire la sottrazione prendendo il complemento a due di un numero (vedi sotto), che richiede solo un ciclo aggiuntivo o il proprio circuito sommatore. Per fare ciò, il circuito si limita a fingere che esista un bit in più a sinistra di 1.

See this related answer for an even more in-depth explanation with lots of nice, easy to understand examples.

3

di Java primitive numeral data types - int, long, byte, e short sono rappresentati in two's complement.Che cosa questo significa:

  • Il valore più alto è il risultato di tutti i bit impostati a 1, tranne che per il MSB.
    • Esempio: 0111 1111 = 127
  • Il MSB essendo impostato a 1 e tutti gli altri bit impostato a 0 è il più basso valore .
    • Esempio: 1000 0000 = -128

L'unico valore negativo qui è il MSB, quindi se noi spezziamo giù in questa rappresentazione, arriveremo a -61:

|-128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | 
| 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 

-128 + 64 + 2 + 1 = -61. 
Problemi correlati