Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Μετάβαση στο περιεχόμενο

Συμπλήρωμα ως προς 1

Από τη Βικιπαίδεια, την ελεύθερη εγκυκλοπαίδεια
Ψηφία/Bits Χωρίς πρόσημο Συμπλήρωμα ως προς 1
0111 1111 127  127 
0111 1110 126  126 
0000 0010 2  2 
0000 0001 1  1 
0000 0000 0  0 
1111 1111 255  −0 
1111 1110 254  −1 
1000 0010 130  −125 
1000 0001 129  −126 
1000 0000 128  −127 

Το συμπλήρωμα ως προς 1 (Αγγλικά: 1s' complement) ενός δυαδικού αριθμού ορίζεται ως η τιμή που παίρνουμε όταν αντιστρέφουμε όλα τα ψηφία (bits) του δυαδικού αριθμού (αλλάζοντας τα 0 σε 1 και το αντίστροφο - το 0 είναι το συμπλήρωμα του 1 και το αντίθετο). Ο αριθμός αυτός λειτουργεί ως ο αρνητικός αριθμός του αρχικού αριθμού σε πράξεις όπως η δυαδική πρόσθεση. Η πράξη της αφαίρεσης "στο χαρτί" από τον άνθρωπο χρησιμοποιεί την ιδέα του "δανεικού κρατούμενου" (Αγγλικά: borrow). Συγκεκριμένα όταν το ψηφίο του μειωτέου είναι μικρότερο από το αντίστοιχο ψηφίο του αφαιρετέου παίρνουμε ένα "δανεικό κρατούμενο". Στα ψηφιακά κυκλώματα υπολογιστών τέτοιες πράξεις υλοποιούνται χρησιμοποιώντας συμπληρώματα ως προς 1 ή συμπληρώματα ως προς 2. Όμως το συμπλήρωμα ως προς 1 παρουσιάζει κάποια προβλήματα στην εφαρμογή του (όπως την ύπαρξη δύο αναπαραστάσεων του μηδέν - του θετικού και του αρνητικού μηδέν) και σπάνια χρησιμοποιείται στους υπολογιστές. Στους σύγχρονους υπολογιστές χρησιμοποιείται το συμπλήρωμα ως προς 2.[1]

Στην αναπαράσταση βάσης με συμπλήρωμα όταν το πιο σημαντικό ψηφίο (MSB: Most Significant Bit) του αριθμού είναι 1 σημαίνει ότι ο αριθμός αυτός είναι αρνητικός. Όλοι οι θετικοί αριθμοί ξεκινάνε με 0 (MSB). Για παράδειγμα ο αριθμός 25 σε 8 bits δυαδική αναπαράσταση ισούται με το 00011001, ενώ ο –25 είναι ο αριθμός 11100110 (αντιστρέφοντας όλα τα bits - συμπλήρωμα ως προς 1). Το πιο σημαντικό ψηφίο είναι 1 και δηλώνει ότι είναι αρνητικός αριθμός ο -25. Αφού το σημαντικότερο ψηφίο είναι το πρόσημο αν έχουμε 8 bits αναπαράσταση, χρησιμοποιούμε τα υπόλοιπα 8-1 = 7 bits για την αναπαράσταση του αριθμού (απόλυτης τιμής). Έτσι μπορούμε να αναπαραστήσουμε θετικούς και αρνητικούς αριθμούς (από το ‑127 έως το +127). Το πρόβλημα σε αυτήν την αναπαράσταση αρνητικών αριθμών είναι ότι έχουμε δύο αριθμούς που αναπαριστούν το μηδέν. Για παράδειγμα σε ένα 8bit δυαδικό ψηφίο το 0000 0000 (είναι 0) αλλά και το 1111 1111 (είναι το -0).[2]

Συμπλήρωμα ως προς την βάση μείον ένα

[Επεξεργασία | επεξεργασία κώδικα]

Ένας αριθμός με βάση και ψηφία έχει συμπλήρωμα ως προς το οποίο δίνεται από το . Στους δυαδικούς αριθμούς και , έτσι έχουμε το συμπλήρωμα ως προς 1 του αριθμού . Το αναπαριστά ένα αριθμό που έχει ως MSB και . Ο αριθμός είναι ο δυαδικός αριθμός με . Για παράδειγμα και . Το συμπλήρωμα ως προς 1 υπολογίζεται αφαιρώντας κάθε ψηφίο από το . Επειδή και αρκεί η αλλαγή κάθε ψηφίου με το "συμπλήρωμά" του, δηλαδή του σε και του σε .[3] Παρακάτω βλέπουμε όλες τους αριθμούς με βάση το συμπλήρωμα ως προς 1 σε 4 στοιχεία bit (nibble): από -7 έως 7:

    +      −
0   0000   1111    υπάρχουν 2 αναπαραστάσεις του 0
1   0001   1110
2   0010   1101
3   0011   1100
4   0100   1011
5   0101   1010
6   0110   1001
7   0111   1000

Η πρόσθεση/αφαίρεση δυο αριθμών γίνεται κατευθείαν χρησιμοποιώντας το συμπλήρωμα ως προς 1. Κατευθείαν πρόσθεση/αφαίρεση των bit και στην περίπτωση που έχουμε υπερχείλιση, προσθέτουμε/αφαιρούμε το 1 στο αποτέλεσμα.

  0001 0110     22
+ 0000 0011      3    —δεν έχουμε υπερχείλιση
 ==========   ====    —όχι κυκλική επαναφορά κρατούμενου στο αποτέλεσμα.
  0001 1001     25

Παρακάτω έχουμε ένα παράδειγμα αφαίρεσης αριθμών:

  0000 0110      6
− 0001 0011     19
 ==========   ====
1 1111 0011    −12    —υπερχείλιση 
− 0000 0001      1    —κυκλική επαναφορά κρατούμενου στο αποτέλεσμα.
 ==========   ====
  1111 0010    −13    —Το αποτέλεσμα (6 − 19 = -13)

Παρακάτω δείχνουμε ότι το συμπλήρωμα ως προς ένα ενός θετικού αριθμού είναι η αρνητική τιμή του αριθμού:

Πρόσθεσε το 3 στο 19.

  0001 0011     19
+ 0000 0011      3
 ==========   ====
  0001 0110     22

Αφαίρεσε το −3 από το 19.

  0001 0011     19
− 1111 1100     −3
 ==========   ====
1 0001 0111     23    —υπερχείλιση
− 0000 0001      1    —αφαίρεση κυκλικής επαναφοράς κρατούμενου στο αποτέλεσμα.
 ==========   ====
  0001 0110     22    —Το αποτέλεσμα (19 − (−3) = 22).

Το αρνητικό μηδέν είναι η περίπτωση όπου όλα τα bits έχουν την τιμή 1. Η πρόσθεση ή η αφαίρεση του αρνητικού μηδέν δίνει την αρχική τιμή.

Προσθέτοντας αρνητικό μηδέν:

  0001 0110     22
+ 1111 1111     −0
 ==========   ====
1 0001 0101     21    
+ 0000 0001      1    —κυκλική επαναφορά κρατούμενου στο αποτέλεσμα.
 ==========   ====
  0001 0110     22    —Το αποτέλεσμα είναι (22 + (−0) = 22)

Αφαιρώντας το αρνητικό μηδέν:

  0001 0110     22
− 1111 1111     −0
 ==========   ====
1 0001 0111     23    —αφαίρεση κυκλικής επαναφοράς κρατούμενου στο αποτέλεσμα.
− 0000 0001      1
 ==========   ====
  0001 0110     22    —Το αποτέλεσμα είναι (22 − (−0) = 22)

Το αρνητικό μηδέν δημιουργείται εάν προσθέσουμε ένα αριθμό με τον αρνητικό του (σε συμπλήρωμα ως προς 1):

  0001 0110     22
+ 1110 1001    −22
 ==========   ====
  1111 1111     −0    —Αρνητικό μηδέν.

Το πρόβλημα με τον αρνητικό μηδέν, παρόλο που στα μαθηματικά δεν παρουσιάζει πρόβλημα σε ένα λογισμικό θα πρέπει να υπάρξει έξτρα έλεγχος.

  1. Mano, Morris (1992). Ψηφιακή Σχεδίαση. Αθήνα: Prentice Hall (έκδοση μετάφρασης: Παπασωτηρίου). σελίδες 15–17. ISBN 960-7182-01-4. 
  2. Harvey G. Cragon (2000). Computer Architecture and Implementation. Cambridge University Press. σελ. 76. ISBN 0521651689. 
  3. Mano, Morris (1992). Ψηφιακή Σχεδίαση. Αθήνα: Prentice Hall (έκδοση μετάφρασης: Παπασωτηρίου). σελίδες 13–14. ISBN 960-7182-01-4.