Forum: Compiler & IDEs large integer implicitly truncated to unsigned type


von David H. (davidm)


Lesenswert?

#define ADDR 0x50
OK

#define ADDR 0xD0
Fehler: warning: large integer implicitly truncated to unsigned type
1
I2C_FORMAT_7_BIT_ADDRESS(SlaveAddress, ADDR, I2C_WRITE);


Nun gut 0x50 ist irgendwas kleineres hingegen 0xD0 setzt das 7. Bit und 
somit ein sign bit.

Wie ist hier der korrekte Weg damit es nicht zu dieser Warnung kommt?

0xD0u habe ich bereits probiert :-)



1
typedef union 
2
{
3
    // Access to the 8-bit format with the 7-bit address and the read/write 
4
    // direction defined.
5
    UINT8       byte;
6
7
    struct
8
    {
9
        // The read/write bit of the I2C address.
10
        UINT8   rw       : 1;
11
12
        // The 7-bit slave address.
13
        UINT8   address  : 7;
14
    };
15
16
} I2C_7_BIT_ADDRESS;

: Bearbeitet durch User
von Amateur (Gast)


Lesenswert?

Umstände, Umgebung, Ziel u.s.w. interessiert doch keinen Menschen.

ADDR ist ev. bereits beschlagnahmt.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Falls I2C_FORMAT_7_BIT_ADDRESS eine Funktion ist, hängt es von deren 
Prototyp ab.

Falls I2C_FORMAT_7_BIT_ADDRESS ein Makro ist -- was die Namenskonvention 
vermuten läßt -- hängt es von der Definition des Makros ab.

Grüße von der Kristallkugel...

von David H. (davidm)


Lesenswert?

Ach so das pielt auch mit rein

#define I2C_FORMAT_7_BIT_ADDRESS(v,a,r) ( (v).address=(a), (v).rw=(r) )

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Klar, und nun weiß jeder wie diese Dinger deklariert sind.

von Stefan E. (sternst)


Lesenswert?

.address ist ein Bit-Feld der Größe 7 (der Name des Makros sagt es doch 
schon). Mit keinem Trick der Welt kannst du da ein 0xD0 rein stopfen.

Dein 0xD0 ist vermutlich bereits die I2C-Adresse inklusive des 
RW-Bits.

: Bearbeitet durch User
von David H. (davidm)


Lesenswert?

Jetzt checke ich auch das dieses Makro zusammen mit der union funzt, 
aaaah.

Wir haben hier also das R/W Bit am ende und davor eine 7 Bit Adresse.

Laut Datenblatt (MCP3422 Seite 20) besteht die 7Bit Adresse aus

4Bit Device ID 1101
und

3Bit Address Bits
000

Also: 1101000 entspricht einem 0x68 ?

von Mark B. (markbrandis)


Lesenswert?

David Mueller schrieb:
> Also: 1101000 entspricht einem 0x68 ?

Was denn auch sonst? Die am weitesten rechts stehende Ziffer einer 
ganzen Zahl hat immer die Wertigkeit "Basis des verwendeten 
Zahlensystems hoch Null".

Sicher könnte man irgendwas anderes definieren wenn man wollte, aber das 
wäre dann doch etwas seltsam ;-)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Mark Brandis schrieb:
> David Mueller schrieb:
>> Also: 1101000 entspricht einem 0x68 ?
>
> Was denn auch sonst? Die am weitesten rechts stehende Ziffer einer
> ganzen Zahl hat immer die Wertigkeit "Basis des verwendeten
> Zahlensystems hoch Null".

Also Eins :-)

von Mark B. (markbrandis)


Lesenswert?

Johann L. schrieb:
> Also Eins :-)

Ja. Außer bei null hoch null. ;-)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Mark Brandis schrieb:
> Johann L. schrieb:
>> Also Eins :-)
>
> Ja. Außer bei null hoch null. ;-)

Null als Basis für ein Zahlensystem ist nicht wirklich sinnvoll.

von Mark B. (markbrandis)


Lesenswert?

Johann L. schrieb:
> Null als Basis für ein Zahlensystem ist nicht wirklich sinnvoll.

Ich mach am besten noch (null geteilt durch null) weitere Smileys dazu.

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.