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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren