Wie kann ich diese Warnung unterdrücken?
Der Code soll im Grunde einfach nur eine 4 Byte breite Zahl aus dem
I2C-EEPROM lesen und entsprechend zusammensetzen.
lg, Peter
Für den Compiler sind solche Konstrukte erstmal ints (hier wohl 16 bit
lang). Will man mehr um mehr als 15 schieben, muss man auf einen
grösseren Typ casten.
Edit: Ok, mein Nachfolger hat recht, man muss alles casten. Was ich
geschrieben hab, gilt für konstante werte, die beim compilieren
ausgerechnet werden.
vereinbart ist, wird erst mal mit Bytes gerechnet, und die sind nunmal
acht Bit breit.
Wenn du jetzt
1
(i2c_get_byte(true) << 8)
machst, rechnen wir immer noch mit den 8-Bit breiten Bytes, aber du
schiebst quasi mit "<<8" bis hin zur 16. Stelle nach links, und das geht
beim Byte eben nicht.
Lösung: Zwing dem Compiler was Breiteres auf (Casting):
> machst, rechnen wir immer noch mit den 8-Bit breiten Bytes, ...
Nein, machen wir nicht. Wir rechnen dann mit `int' (aber mit einem
vorzeichenbehafteten!), weil das die integer promotion rules der
Sprache C so verlangen.
Phillip Hommel schrieb:
> Ich habe es so gemacht wie oben beschrieben
Nein, hast du nicht. Du musst "*(var->value)" casten, nicht das Ergebnis
vom Shift.
Holla zusammen!
Ich habe auch gerade das oben genannte Problem, aber in einer Abfrage:
1
if(x&=(1<<25))
2
{
3
;
4
}
Erklärt sihc ja eigentlich von selbst: x ist ein long und ich will Bit
25 abfragen.
Aber ich check nicht ganz, wo ich dann casten muß.
Würd mich freuen, wenn mich jemand fix aufklärt :)
VG
@ A.K.:
OH!
Das ist ja toll! DANKE!
Kannst du mir vielleicht auch kurz erklären, warum das so ist? einfach
eintippern ist zwar schön einfach, aber ich würd das gern verstehen :)
VG
Joachim A. schrieb:
> Kannst du mir vielleicht auch kurz erklären, warum das so ist? einfach> eintippern ist zwar schön einfach, aber ich würd das gern verstehen :)
Weil die 1 sonst nur ein int ist, also 16 Bit groß.
Joachim A. schrieb:
> Kannst du mir vielleicht auch kurz erklären, warum das so ist? einfach> eintippern ist zwar schön einfach, aber ich würd das gern verstehen :)
1L ist (long)1
Wenn dir das auch nix nützt, dann solltest du mal einen Blick in ein C
Handbuch riskieren.
@Stefan:
Ups, da mit dem "&=" hab ich nicht aufgepasst, danke ;) ...
Und die Erklärung hat auch geholfen. Ich mach jetzt schon ne weile C,
aber ich hab nie darüber nachgedacht, daß Konstante, wie die 1 da, auch
int's sind...
Aber ok, wieder was gelernt :)