ergebnis kann negativ werden, obwohl nur uint8_t verwendet wird

Gast #6637244
Lesenswert?
• ▲
▼
Guten morgen,

ich habe mal eine frage zum casten in c
1
#define OFFSET 120
2

3
uint8_t a;
4
uint8_t b;
5
uint8_t c;
6
uint8_t d;
7

8
a = 10;
9
a = 10;
10
a = 10;
11
a = 10;
12

13
if((a + b + c + d - OFFSET) < 0)
14
{
15
   ...
16
}

alles (bis auf das OFFSET) ist uint8_t.
uint8_t kann ja eigentlich nicht <0 werden.
Dennoch wird die Bedingung erfüllt. Sollte man die einzelnen dennoch auf 
int8_t casten?
#6637255
Lesenswert?
• ▲
▼
Lars schrieb:
> Sollte man die einzelnen dennoch auf int8_t casten?

Nur wenn du mit Maschinen rechnen musst, deren Pre-ANSI-C Compiler seit 
35 Jahren nicht mehr renoviert wurde.

Wenn du allerdings von "uint8_t" zu "unsigned" wechselst, wird dir 
mancher Compiler die ganze Abfrage wegoptimieren. Denn dann kann es 
unabhängig von eingesetzten Werten wirklich nicht negativ werden.
Gast #6637265
Lesenswert?
• ▲
▼
Μαtthias W. schrieb:
> Und zum nachlesen
>
> https://stackoverflow.com/questions/46073295/implicit-type-promotion-rules
>
> Matthias

Aber wenn ich mir dort mal das 2.Beispiel ansehe, verstehe ich es wieder 
nicht, wie die Bedingung erfüllt werden kann.
1
int main(){
2
    unsigned int a = 1;
3
    signed int b = -2;
4
    if(a + b > 0)
5
        puts("-1 is larger than 0");
6
        printf("%u\n", a+b);
7
}
1
-1 is larger than 0
2
42949672957
hier ist das Ergebnis zwar nicht max uint8, aber max uint32. Welches 
aber auch nicht negativ ist.
#6637282
Lesenswert?
• ▲
▼
Hier wird die Rechnung in unsigned durchgeführt, da "signed int" und 
"unsigned int" gleich gross sind und nicht erweitert werden. Da wird 
stets in "unsigned" gerechnet, kann also zwar 0 werden, aber nicht 
negativ.

Obacht: "uint32_t" und "unsigned" können verschieden sein. "uint8_t" 
wird aber immer kleiner als "unsigned" sein.
Gast #6638323
Lesenswert?
• ▲
▼
Versuche mal
Printf(„s = %s\n“, a+B)
Dann mit %d %f %c %x %ld %l ... usw. schaue mal was da allgemein so 
rauskommt
If((uint8_t) (a+b) > 0) - geht das ?

Anscheinend castet if intern auf int


Ist wirklich interessant habe selbst leider keine Ahnung - sorry
Viel Erfolg Hast hoffentlich schnell eine Lösung

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