Signed bedeutet ja mit Vorzeichen, und dieses verbraucht ja auch ein Bit. Ein 1-Bit-Signed-Int würde doch nur aus Vorzeichen bestehen, oder irre ich mich da? Wäre jedenfalls keine sinnvolle Zahl...
Nix weltbewegendes,
habe mich eben nur gewundert über einen Warning
Nun kam mir die Frage:Code:typedef volatile union { struct { unsigned int dat1 : 1; signed int dat2 : 1; /* [Warning] : signed bitfield of length 1 */ int dat3 : 1; int rest : 29; } bits; unsigned int value; } TRegister;
ist ein "signed int" nicht das selbe (gleiche) wie ein "int" ???
Eigentlich ist ein signed int ja "doppelt gemoppelt" und entsprechend unnötig.
Aber ich finde den Warning sogar sehr gut, denn dat2 hätte ja nichts weiter wie ein Vorzeichen, was wohl wenig Sinn macht.
Dann müste man aber alle "ein Bit" Daten als "unsigned int" erklären. Wäre zumindest sinnvoll.
Laut ANSI-C soll es aber ein "int" sein.
Nun wird man sich fragen, was will der Siro darauf für eine Antwort haben.
Keine, war nur eine Feststellung.
Ein schönes Wochenende wünsche ich.
Siro
Signed bedeutet ja mit Vorzeichen, und dieses verbraucht ja auch ein Bit. Ein 1-Bit-Signed-Int würde doch nur aus Vorzeichen bestehen, oder irre ich mich da? Wäre jedenfalls keine sinnvolle Zahl...
Hallo Geistesblitz,
das ist ja genau das, was ich meine.
Ich darf ein einzelnes Bit als "int" definieren. Das ist natürlich völliger Blödsinn.
Deshalb bin ich ja der Meinung, daß ein einzelnes Bit unweigerlich ein "unsigned" sein müste.
Aber bevor ich mich wieder mal negativ über "C" äussere, nehme ich das mal so hin......
Wär ich Compiler, würde ich meckern, Ein Bit kann kein Int sein
Und das hat der Compiler ja auch richtig angemeckert als ich ihm einen "signed int" angeboten habe,
mal abgesehen davon, daß es diesen Typen wohl nicht gibt.
Siro
Geändert von Siro (18.11.2011 um 21:52 Uhr)
Bei einem Bitfeld bedeutet "int" NICHT automatisch "signed".
Ob bei einem Bitfeld ein "int" "signed" oder "unsigned" ist, ist "implementation-defined", wird also vom Compiler festgelegt. Und offenbar ist es bei dem von dir verwendeten Compiler "unsigned", denn sonst würde er ja auch bei "int dat3 : 1;" eine Warnung bringen.
Geändert von sternst (19.11.2011 um 01:00 Uhr)
MfG
Stefan
Guten Morgen Sternst und die anderen...
Um deine Aussage zu prüfen, habe ich gleich mal folgendes probiert:
Und siehe da, Du hast vollkommen recht, der (mein) Compiler interpretiert bei Bit Definitionen den int tatsächlich "vorzeichenlos".Code:struct { int dat1 : 3; signed int dat2 : 3; } st; int main(void) { int a; st.dat1 = -3; st.dat2 = -3; a = st.dat1; /* a ist nun +5 !!!!!!!!! */ a = st.dat2; /* a ist nun -3 */ }
Dann ist also meine Frage garnicht so dumm gewsesen. Bei Bitdefinitionen ist es also sehr wohl erlaubt (bzw.) sogar Pflicht
dem int ein Vorzeichen aufzudrängeln, sonst verhält sich der Code unter Umständen nicht wie vorgesehen.
Ich hab den Satz mal fett gemacht, ich glaube das ist eine ganz wichtige Aussage.
Ich danke Dir, für die Info.
Siro
Geändert von Siro (19.11.2011 um 09:38 Uhr)
Mit bestem Gruß
Frank
Admin Roboternetz.de - RN-Wissen.de - Elektronik-Blog
Überzeugter und begeisterter Elektroauto Fahrer seit 2018
Hallo Frank,
hast recht, der Vollständigkeit halber:
Der C-Compiler von IAR Embedded Workbench
interpretiert einen int bei Bitdefinitionen vorzeichenlos.
Möchte man eine Bitkombination mit Vorzeichen haben, muss man einen
signed int benutzen.
Eine offizelle Bestätigung habe ich heute von IAR erhalten mit einem Verweis auf die Online Dokumentation des C++ Compilers, Seite 290
Den Ausschnitt habe ich mal angehangen. Zudem gibt es eine #pragma bitfield directive, mit der man unter anderem die Bit Reihenfolge einstellen kann LSB / MSB first usw.
Siro
Geändert von Siro (23.11.2011 um 08:56 Uhr)
Lesezeichen