char ist größer als 8 bit?!

OP Persönliche Seite #283988
Lesenswert?
• ▲
▼
Hey, folgendes Problem

aus:
1
unsigned char charset(unsigned char val)
2
{
3

4
    switch (val)
5
    {
6
        case 0:
7
            return (~((1<<5)|(1<<7)|(1<<3)|(1<<1)|(1<<2)|(1<<6)));
8
        case 1:
9
            return (~((1<<7)|(1<<3)));
10
        case 2:
11
            return (~((1<<5)|(1<<7)|(1<<4)|(1<<2)|(1<<1)));
12
        case 3:
13
            return (~((1<<5)|(1<<7)|(1<<4)|(1<<3)|(1<<1)));           
14

15
        case 4:
16
            return (~((1<<6)|(1<<4)|(1<<7)|(1<<3)));            
17
        case 5:
18
            return (~((1<<5)|(1<<6)|(1<<4)|(1<<3)|(1<<1)));           
19

20
        case 6:
21
            return (~((1<<5)|(1<<6)|(1<<4)|(1<<3)|(1<<1)|(1<<2)));     
22
      
23
        case 7:
24
            return (~((1<<5)|(1<<7)|(1<<3)));            
25
        case 8:
26
            return
27
(~((1<<5)|(1<<7)|(1<<4)|(1<<3)|(1<<1)|(1<<2)|(1<<6)));            
28
        case 9:
29
            return (~((1<<5)|(1<<7)|(1<<4)|(1<<3)|(1<<1)|(1<<6)));
30

31
    }
32
    
33
    return 0;
34
}

wird in der list datei (GEKÜRZT!):
1
 119 0040 9927          clr r25
2
 120 0042 8430          cpi r24,4
3
 121 0044 9105          cpc r25,__zero_reg__
4
 122 0046 81F1          breq .L16
5
 
6
 //SCHNITT (hier wären die ganzen andern switch cases..
7

8
 183                 .L16:
9
 184                 .LM19:
10
 185 00a8 87E2          ldi r24,lo8(39)
11
 186 00aa 90E0          ldi r25,hi8(39)
12
 187 00ac 0895          ret

Warum macht er aus dem Rückgabewert aufeinmal 16Bit? Der höchste
zurückgegebene Wert ist übrigens 133.
Gast #283989
Lesenswert?
• ▲
▼
Das ist ne Eigenart der AVR-GCC.

Switches und Returnwerte werden immer auf 16 Bit erweitert.

Dadurch ergibt sich das Kuriosum, daß Funktionen mit unsigned int als
Returnwert kleineren Code erzeugen können als mit unsigned char.


Und auch tunlichst unsigned char verwenden, weil sonst noch zusätzlich
eine Vorzeichenexpansion gemacht wird.


Peter
Gast #283994
Lesenswert?
• ▲
▼
Probier mal "-mint8" als GCC Option. Dann sollten zumindest die
Switch-Cases als 8Bit Werte durchlaufen. Habe selber die Option noch
nie benutzt. Aber vorsicht dann mit Deinen Variablen die werden dann
auch gewandelt.
Gast #283999
Lesenswert?
• ▲
▼
Unter AVR-GCC 4.0.2 (binutils 2.16.1, AVR-Libc 1.4.0) wird dieser Case
mittels ijmp implementiert.

Bei kleinerer Anzahl case Fälle wird korrekt ein byte getestet.
  de:  82 30         cpi  r24, 0x02  ; 2
  e0:  89 f0         breq  .+34       ; 0x104
  e2:  83 30         cpi  r24, 0x03  ; 3
  e4:  28 f4         brcc  .+10       ; 0xf0

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.