Gerade Potenzen als Größe

Gast #3067050
Lesenswert?
• ▲
▼
Moin

Wie der Titel schon sagt geht es darum:
In einem Projektbeispiel wird man darauf hingewiesen als Größenangabe 
für ein Array, welches im "idata"-Bereich des Speichers liegt, nur 2er 
Potenzen zu verwenden, also:
2,4,8,16,32 u.s.w.

Wieso kann ich nicht einfach irgendeine Größe wie 1 oder 3 nehmen?
Gast #3067096
Lesenswert?
• ▲
▼
Ebert schrieb:
> Prozessor: Infineon-C515C
> Array: vom Typ "int" --> Aber Größenangabe muss einer Zweierpotenz sein,
> wieso? (Es kann 2, 4, 8, u.s.w. sein)
> Wieso geht nicht einfach 3 oder 7?

Der Grund der Einschränkung liegt bestimmt nicht beim Prozessor. Wer 
oder was soll mich daran hindern, ein Array mit 7 Elementen zu 
deklarieren/definieren?
Gast #3067109
Lesenswert?
• ▲
▼
>In einem Projektbeispiel wird man darauf hingewiesen als Größenangabe
>für ein Array, welches im "idata"-Bereich des Speichers liegt, nur 2er
>Potenzen zu verwenden
> Wieso kann ich nicht einfach irgendeine Größe wie 1 oder 3 nehmen?

Meine Glaskugel sagt : Weil es so programmiert ist und nicht anders, 
sonst würde es auch gehen !
Moderator #3067133
Lesenswert?
• ▲
▼
Es ist oft sinvoll, dafür zu sorgen, dass die Größe der Elemente von
Arrays Zweierpotenzen sind, weil dadurch bei Array-Zugriffen aufwendige
Multiplikationen entfallen. Das ist aber kein Muss, sondern dient nur
der Optimierung des Programms. Die Array-Größe an sich sollte eigentlich
egal sein.

Ebert schrieb:
> Ja es gehen nur Zweierpotenzen: 2, 4, 8, 16, 32, ...
> Es ist ein C51-Compiler von Keil

Was spricht der Compiler, wenn du frecherweise trotzdem eine Größe von
bspw. 7 nimmst, also
1
int array[7];
?
Gast #3067150
Lesenswert?
• ▲
▼
> Array: vom Typ "int" --> Aber Größenangabe muss einer Zweierpotenz sein,
> wieso? (Es kann 2, 4, 8, u.s.w. sein)
> Wieso geht nicht einfach 3 oder 7?


Das ist keine zwingende VOrgabe. Wenn du Array mit Grössen von 
Zweierpotenzen hast, dann ist es einfacher, eine Bereichsprüfung zu 
machen.

Bsp. Array[0..7] => 8 Elemente
Wenn du das jetzt indizierst mit x, reicht es, wenn x auf die letzten 
drei Bits begrenzt wird:

x = ( x & 7 );

Das kann nie über die Grenzen hinaus.

Hast du eine willkürliche Zahl dagegen, zB Array[0..17], dann musst du 
mit modulo arbeiten:

x = ( x % 17 );

Das braucht, je nach geheimem Prozessor, enorm Resourcen.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.