clear code zum Zählen von 0 bis 255 unter Verwendung eines 8-Bit-Datentyps

8

Ich habe mich gefragt, ob es einen sauberen Weg gibt, von 0 bis 255 mit einem 8-Bit-Datentyp zu zählen, etwa wie folgt:

%Vor%

Dies funktioniert natürlich nicht, aber es macht deutlich, dass Sie von 0 bis 255 zählen wollen.

Eine funktionierende Lösung wäre etwas wie:

%Vor%

Aber hier ist es überhaupt nicht klar, es zählt von 0 bis 255.

Das wird auch funktionieren, aber es ist nur hässlich IMHO:

%Vor%

Ich frage mich also, gibt es eine saubere Möglichkeit, dies zu tun, ohne einen größeren Datentyp zu verwenden?

BEARBEITEN:

  • Ich mag die Version, die for verwendet, weil sie ihre Absicht klar macht, ohne zu denken: eine Schleife von 0 bis 255. Alle anderen Versionen erfordern ein Nachdenken über das, was vor sich geht, und daher eher andere verwirren.
  • Ich möchte int nicht verwenden, weil der Code für einen 8-Bit-Mikrocontroller mit wenig Speicher ist.
rve 10.11.2009, 13:03
quelle

10 Antworten

21

Was ist mit:

%Vor%     
ot. 10.11.2009, 13:23
quelle
8

Ich bin mir nicht sicher, was Sie meinen, aber

%Vor%

sollte tun, was Sie fragen und hat einen expliziten Verweis auf 255 (nutzlos, wenn Ihr Compiler C99 Standard ist und uint8_t ist wirklich 8 Bits).

    
Remo.D 10.11.2009 13:16
quelle
5

Was ist los mit dem Offensichtlichen?

%Vor%     
Dipstick 10.11.2009 13:24
quelle
2

Sie scheinen die Nachricht des Zählens von 0 bis 255 anhand des von Ihnen verwendeten Datentyps zu übermitteln, aber was bedeutet 255? Sie sollten diese magische Zahl wahrscheinlich mit einem Namen definieren, der ausdrücklich den Zweck angibt. Außerdem wäre ein Kommentar über der Aussage hilfreicher als der Versuch, all diese Informationen in etwas seltsam aussehende Aussagen zu "codieren".

Zum Beispiel:

%Vor%

Fügen Sie bei Bedarf einen Kommentar hinzu, warum die Anzahl der Wiederholungen auf 255 begrenzt ist.

    
cschol 10.11.2009 13:28
quelle
2

Ich würde vorschlagen, dass die einfache Lösung:

%Vor%

wird wahrscheinlich auch die effizienteste Lösung sein.

  1. Auch wenn Sie einen kleineren (1 Byte) Datentyp verwenden. Der C-Compiler wird es in jedem Ausdruck zu einem int hochstufen.

  2. Auf einem 8-Bit-Controller ist ein int wahrscheinlich 16-Bit. Bei Verwendung eines Single-Byte-Typs wird nur ein Byte Stack-Speicherplatz gespeichert. Dann kann der Compiler die Variable wieder in ein Register setzen, so dass sowieso keine Speicherplatzeinsparungen erzielt werden.

Überprüfen Sie den Assemblycode, der mit dem obigen Code generiert wurde, und entscheiden Sie dann, ob eine (Platz-) Optimierung erforderlich ist.

    
Ferruccio 27.12.2009 14:24
quelle
0

Zähle in zwei Hälften?

%Vor%     
pmg 10.11.2009 13:10
quelle
0

Sie haben sich so viel Mühe gegeben, um ein Byte zu speichern? Ihr letztes Beispiel würde funktionieren, oder Sie könnten eine Art Kombination aus dem ersten und dem dritten durchführen:

%Vor%

Fragen Sie sich dennoch, ob die zusätzliche Hässlichkeit im Code es wert ist, dieses eine Byte zu speichern. Wenn Sie mit einer Lösung wie dieser gehen, sollten Sie wahrscheinlich dokumentieren, warum Sie es nicht auf die offensichtliche Weise tun.

    
Mattias Nilsson 10.11.2009 13:16
quelle
0

Nun, wenn Sie weniger als klar Code löschen möchten, können Sie immer einen Kommentar hinzufügen;)

Eine Lösung besteht darin, den Körper der Schleife in eine Funktion (oder Makro, wenn öffentliche Auspeitschung kein Problem ist) zu platzieren, und dann:

%Vor%

oder wenn Sie den Geltungsbereich der i - und C ++ - Bereichsregeln nicht erweitern möchten:

%Vor%     
Clifford 10.11.2009 16:27
quelle
0

%Vor%

Scheint mir vollkommen klar.

Auch wenn Sie versuchen, einen 1-Byte-Zähler zu verwenden, kann Ihr Compiler es stattdessen sehr gut in dies verwandeln:

%Vor%

Zum Beispiel macht GCC, weil es schneller ist.

%Vor%     
ephemient 10.11.2009 15:40
quelle
0

Nein, es gibt keinen klaren Weg, dies in reinem alten C zu tun, da die Bedingung nach dem Inkrement geprüft wird und wenn Sie & lt; = 255 vergleichen, werden Sie für immer eine Schleife durchlaufen, da ein 8-Bit-Wert 255 nicht überschreiten und beenden kann .

So wird es.

%Vor%

Es sei denn, Sie denken, dass die Überprüfung gegen 0 (den Umbruch sehen) in Ihrem Buch klar ist. Es ist nicht klar in meinem.

Beachten Sie, dass 8-Bit-Typen bei vielen Compilern sehr ineffizient sind und zu unnötigen Zeichenerweiterungen führen. Möglicherweise möchten Sie stattdessen den Typ "uint_least8_t" verwenden, der wahrscheinlich auf die Wortgröße Ihres Systems erweitert wird und schneller ausgeführt wird.

    
Southern Hospitality 10.11.2009 22:06
quelle

Tags und Links