- LiFePO4 Speicher Test         
Ergebnis 1 bis 7 von 7

Thema: Integer mit einem Bit ?

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076

    Integer mit einem Bit ?

    Anzeige

    Powerstation Test
    Nix weltbewegendes,
    habe mich eben nur gewundert über einen Warning

    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;
    Nun kam mir die Frage:
    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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Geistesblitz
    Registriert seit
    15.03.2011
    Ort
    Dresden
    Alter
    36
    Beiträge
    1.937
    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...

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    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 20:52 Uhr)

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    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 00:00 Uhr)
    MfG
    Stefan

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Guten Morgen Sternst und die anderen...
    Um deine Aussage zu prüfen, habe ich gleich mal folgendes probiert:

    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 */  
    
    }
    Und siehe da, Du hast vollkommen recht, der (mein) Compiler interpretiert bei Bit Definitionen den int tatsächlich "vorzeichenlos".
    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 08:38 Uhr)

  6. #6
    Administrator Robotik Visionär Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    5.116
    Blog-Einträge
    1
    Zitat Zitat von Siro Beitrag anzeigen
    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.

    Damit die Aussage für jemanden von Nutzen ist, müsstest du aber noch den Namen des verwendeten Compilers nennen
    Mit bestem Gruß
    Frank

    Admin Roboternetz.de - RN-Wissen.de - Elektronik-Blog
    Überzeugter und begeisterter Elektroauto Fahrer seit 2018

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    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 07:56 Uhr)

Ähnliche Themen

  1. Word in Integer?...
    Von Karlja im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 10.08.2010, 18:23
  2. 16Bit Integer in 2 8Bit integer
    Von PcVirus im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 29.02.2008, 16:57
  3. integer abschneiden???
    Von MarkusH im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 13.03.2007, 18:17
  4. double to integer oder exp(x) mit integer
    Von fambi_mail im Forum C - Programmierung (GCC u.a.)
    Antworten: 21
    Letzter Beitrag: 02.03.2006, 11:14
  5. Integer in Byte
    Von _Alex im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 03.02.2006, 06:46

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress