Δημοσιεύτηκε: 30 Αύγ 2011, 19:19
από migf1
stamatiou έγραψε:Να ρωτήσω τώρα κάτι άσχετο;
1. Ποιο είναι το μέγεθος ενός αριθμού που είναι από το 0-255;
2. Αν θέλουμε να βάλουμε μερικά 0 σε ένα μια ακολουθία από bits χωρίς να αλλοιωθεί, η μόνη λύση είναι να τα βάλουμε στην αρχή;

1. Αν εννοείς πόσο χώρο πιάνει στη μνήμη, τότε 1 byte (δηλαδή 8 bits)... στη C το μόνο data type που πιάνει εγγυημένα 1 byte είναι το char. Αν είναι δηλωμένο unsigned (δλδ χωρίς πρόσημο, μόνο θετικοί) μπορεί να φιλοξενήσει τιμές από το 0 έως το 255. Αν είναι δηλωμένο ως signed τότε μπορεί να φιλοξενήσει τιμές από -128 έως 127.

Όταν μιλάμε για unsigned μπορείς να το υπολογίσεις και μόνος σου, αφού το κάθε bit είναι ουσιαστικά μια δύναμη του 2, ξεκινώντας από την 0. Για παράδειγμα σε ένα byte, που έχει δλδ 8 bits, η μέγιστη τιμή που μπορεί να φιλοξενήσει υπολογίζεται ως εξής:
2^0 + 2^1 + 2^2 + 2^3 + 2^4 + 2^5 + 2^6 + 2^7 (που ισούται με 255 ;) )

Για τους αρνητικούς αριθμούς (signed) συνήθως χρησιμοποιείται μια τεχνική που λέγεται 2's Complement, αλλά αρκετά σε έπρηξα :lol: Γκουγκλάρισέ το αν θες να δεις τι κάνει (βασικά αντιστρέφει όλα τα bits του θετικού και προσθέτει το 1).

Βέβαια οι σύγχρονοι υπολογιστές δεν μπορούν να αναφερθούν σε 1 μόνο byte, αναφέρονται στα λεγόμενα words που ανάλογα την πλατφόρμα μπορεί να είναι από 2, 4 ακόμα και 8 bytes (16, 32 και 64 bits αντίστοιχα)... υπάρχουν κι ενδιάμεσα words, π.χ. με 24 bits αλλά είναι πιο σπάνια).

Οπότε αν π.χ. η πλατφόρμα σου δουλεύει με 16-μπιτα words (2 bytes) όταν δηλώνεις στην C ένα char, πιάνει το 1 από τα 2 bytes (και το άλλο πρέπει να γίνει padding). Αν η πλατφόρμα σου δουλεύει με 32-μπιτα words, τότε πρέπει να γίνουν pad τα υπόλοιπα 3 bytes και πάει λέγοντας. Οι μέγιστες ταχύτητες εκτέλεσης επιτυγχάνονται όταν τα data είναι aligned σε πολλαπλάσια του word, αφού δεν χρειάζεται να γίνουν πρόσθετες πράξεις προκειμένου να βρεθούν. Επίσης, ανάλογα την πλατφόρμα, τα bytes μπορεί να ξεκινάνε από αριστερά προς τα δεξιά (low byte order) ή από τα δεξιά προς το αριστερά (high byte order). Όλα αυτά τα διδάσκεσαι στην Αρχιτεκτονική Υπολογιστών και στην Assembly.

Για να επιστρέψουμε στη C, αν θέλεις να δεις στην πλατφόρμα σου πόσο χώρο καταλαμβάνει στη μνήμη μια μεταβλητή χ, κάνεις: sizeof(x)... ή μπορείς να το κάνεις και με data types, π.χ. sizeof(char) ή sizeof(int)... μπορείς να το κάνεις και με δικά σου data types, π.χ...
Κώδικας: Επιλογή όλων

typedef struct myrecord {
int n;
float x;
char s[10+1];
} MyRecord;

int main( void )
{
...
printf( "%d\n", sizeof(MyRecord) );
...
}

Η εντολή sizeof σου γυρίζει πάντα bytes (αν το πολλαπλασιάσεις με 8 βλέπεις το πλήθος των bits).
Κώδικας: Επιλογή όλων

int nbits = sizeof( MyRecord ) * 8;


2. Ναι, αλλά ανάλογα την πλατφόρμα η αρχή διαφέρει... σε low byte order πλατφόρμες η αρχή είναι από αριστερά, σε high byte order είναι από δεξιά.