Forum: PC-Programmierung fragen zum cast in C


von Chandler B. (chandler)


Lesenswert?

Guten morgen,
ich habe mal eine frage zum casten von Variablen in C.
1
#define OFFSET 500u
2
3
uint16_t var = 65500u;
4
5
uint16_t res1;
6
uint16_t res2;
7
8
res1 = var + OFFSET;
9
res2 = (uint16)(var + OFFSET);

bei res2 bekomme ich 465 heraus. Bei res1 bekomme ich 66000 heraus.
ist res1 dann automatisch auf uint32 gecastet worden? welchen typ hat 
var dann nach dieser berechnung?

von Klaus W. (mfgkw)


Lesenswert?

Chandler B. schrieb:
> Bei res1 bekomme ich 66000 heraus.

Sicher?

von Oliver S. (oliverso)


Lesenswert?

Chandler B. schrieb:
> ist res1 dann automatisch auf uint32 gecastet worden?

Das wäre katastrophal, wenn sich C-Datentypen von alleine ändern 
könnten.

Und da ein uint16_t nun mal nicht größer als 65535 werden kann, solltest 
du das hier nochmal genau überprüfen:

Chandler B. schrieb:
> Bei res1 bekomme ich 66000 heraus.

Oliver

: Bearbeitet durch User
von Walter K. (walter_k488)


Lesenswert?

Was mag wohl die 500u für ein Datentypen sein? Hmm?

von Klaus W. (mfgkw)


Lesenswert?

Es stimmt zwar (angenommen, dein System hat 4 Byte für int bzw. 
unsigned), daß 500u 32 Bit hat, und deshalb var+OFFSET erstmal in 32 Bit 
den Wert 66000 hat.
Aber beim Zuweisen an eine 16 Bit breite res1 wird das wieder gekappt, 
da passen die 66000 nicht rein.

von Christian F. (christian_f476)


Lesenswert?

Chandler B. schrieb:
> bei res2 bekomme ich 465 heraus. Bei res1 bekomme ich 66000 heraus.

Wie hast Du dass denn untersucht?

von foo (Gast)


Lesenswert?

1
#include <stdint.h>
2
3
#define OFFSET 500u
4
5
int main() {
6
  uint16_t var = 65500u;
7
  uint16_t res1;
8
  uint16_t res2;
9
10
  res1 = var + OFFSET;
11
  res2 = (uint16_t)(var + OFFSET);
12
13
  return 0;
14
}

Ich bekomme 464 für beide Variablen im Debugger.

von Klaus H. (klummel69)


Lesenswert?

>res2 = (uint16)(var + OFFSET);

uint16 soll wohl uint16_t sein, oder?
Ich empfehle immer den Originalcode zu kopieren und nicht neu zu tippen.
Fehler im Originalcode werden beim Abtippen entweder übersehen oder neue 
werden eingebaut.

Der wichtigste Fehler liegt also zuerst mal in der Diskrepanz zwischen 
Originalcode und Fragebeitrag.

von MaWin (Gast)


Lesenswert?

Chandler B. schrieb:
> Bei res1 bekomme ich 66000 heraus.

sicher nicht.

von jo (Gast)


Lesenswert?

66000 (dez) = 101d0 (hex), passt nicht in eine 16 Bitzahl

Der 16 bit-Wert - 10000 (dez) angeschnitten - entspricht nicht nur 
zufällig 464 (dez).

Just my 2 ct.

von Dirk B. (dirkb2)


Lesenswert?

Chandler B. schrieb:
> Bei res1 bekomme ich 66000 heraus.

Wie hast du das überprüft?
Das gibt dein Code nicht her.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.