-         

Ergebnis 1 bis 7 von 7

Thema: Integer mit einem Bit ?

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.11.2007
    Ort
    Berlin
    Beiträge
    521

    Integer mit einem Bit ?

    Anzeige

    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
    16.03.2011
    Ort
    Dresden
    Alter
    30
    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-Spezialist
    Registriert seit
    05.11.2007
    Ort
    Berlin
    Beiträge
    521
    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)

  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 01:00 Uhr)
    MfG
    Stefan

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.11.2007
    Ort
    Berlin
    Beiträge
    521
    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 09:38 Uhr)

  6. #6
    Administrator Robotik Einstein Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    4.989
    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

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.11.2007
    Ort
    Berlin
    Beiträge
    521
    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)

Ähnliche Themen

  1. Word in Integer?...
    Von Karlja im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 10.08.2010, 19:23
  2. 16Bit Integer in 2 8Bit integer
    Von PcVirus im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 29.02.2008, 17:57
  3. integer abschneiden???
    Von MarkusH im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 13.03.2007, 19: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, 12:14
  5. Integer in Byte
    Von _Alex im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 03.02.2006, 07:46

Berechtigungen

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