short int vs int Probleme

Dieses Thema im Forum "C/C++" wurde erstellt von matzeed7, 08.06.2007.

  1. #1 matzeed7, 08.06.2007
    matzeed7

    matzeed7 Mitglied

    Dabei seit:
    28.10.2006
    Beiträge:
    38
    Zustimmungen:
    0
    Hallo,

    ich habe heute bemerkt das es zu einem Widerspruch bei einer
    meiner Implemenrierungen kommt!

    ich habe versucht die einzelnen Bit eines int auszugeben.
    dazu habe ich mir eine kleines testfile geschrieben. Indem folgender code
    vorkam:
    Code:
    unsigned int wert=0xfc;
     for(int i=0;i<32;i++){
    		cout  <<((wert<<i)>>31 ) ;
     }
    
    die ausgabe war wie von mir erwartet:
    0000 0000 0000 0000 0000 0000 1111 1100

    nun wollte ich, um a bissel platz zu sparen, das ganze auf unsigned short int
    überführen was ja eine grösse von nur zwei byte ergibt, also habe ich die
    31 in eine 15 umgetauscht, aber die ausgabe war nicht die die ich erwartete!!

    Code:
    unsigned short int test=0xfc;
    	
    	 for(int i=0;i<16;i++){
    		cout  <<((test<<i)>>15 ) ;
             }
    
    ausgabe: 00000000137153163126252

    kann mir wer sagen wo mein fehler(denkfehler) liegt!!!

    Danke schon mal im voraus
    Gruss Matze
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 dietox, 08.06.2007
    Zuletzt bearbeitet: 08.06.2007
    dietox

    dietox Eroberer

    Dabei seit:
    26.05.2007
    Beiträge:
    74
    Zustimmungen:
    0
    ( Hast du schon versucht, das ganze zu casten? ) < Oo'

    PS: Wenn's dir schon auf Geschwindigkeit ankommt, nimmt ASM oder nutze den Heap/Freispeicher (C++: new x| C: x = malloc())
     
  4. #3 musiKk, 08.06.2007
    Zuletzt bearbeitet: 08.06.2007
    musiKk

    musiKk Dr. Strangelove

    Dabei seit:
    30.07.2006
    Beiträge:
    264
    Zustimmungen:
    0
    Ort:
    Leipzig
    Aeh... 0xfc ist 252. Jeder Linksshift halbiert die Zahl, darum ist die Ausgabe voellig korrekt (schreib hinter deine Ausgabe mal noch eine Newline, dann siehste die einzelnen Werte). In welcher Form du die Variable deklarierst, ist egal. So gesehen bringt das gar nichts.

    Um eine Zahl in die Binaerdarstellung umzurechnen, muss man den Rest betrachten, der bei jeder Division durch 2 entsteht.

    edit: Bleh, nicht richtig geschaut. Ich verweise dennoch auf meine Methode und zitiere meinen Prof: "Wenn sie so ueber den Code nachdenken muessen, dann ist es schlechter Code. Sowas schreiben Sie bitte nicht!"
     
  5. #4 matzeed7, 14.06.2007
    Zuletzt bearbeitet: 14.06.2007
    matzeed7

    matzeed7 Mitglied

    Dabei seit:
    28.10.2006
    Beiträge:
    38
    Zustimmungen:
    0
    muss man denn den rest beachten, wenn die zahlen schon binär abgelegt sind
    also zb als doubleword oder so?
     
  6. musiKk

    musiKk Dr. Strangelove

    Dabei seit:
    30.07.2006
    Beiträge:
    264
    Zustimmungen:
    0
    Ort:
    Leipzig
    Was meinst du mit "binaer abgelegt"? Die Zahlen sind nur binaer, anders kann sie der Rechner doch gar nicht speichern. Ob du sie in deinem Quelltext nun binaer, oktal, dezimal oder hexadezimal schreibst, ist egal, das bastelt der Compiler um.
     
  7. dpkg

    dpkg Mitglied

    Dabei seit:
    21.04.2007
    Beiträge:
    46
    Zustimmungen:
    0
    Ort:
    Linz
    Durch den linksshift
    Code:
    (test<<i)
    
    wird auf int(4 byte) gecastet.
    Deshalb gehen die bits vor bin number i nicht verloren und werden mitausgegeben.
    Vielleicht könntest du dich damit etwas spielen, aber das sind 2 Byte Stackspeicher sicher nicht wert!
     
  8. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    Um die einzelnen bits zu testen, musst Du mit Binaeroperatoren arbeiten, etwa in der Art
    Code:
    for(int i = 0; i < sizeof(int); ++i)
    { 
      std::cout << (test & (1<<i)) << '|';
    }
     
  9. #8 marcellus, 16.06.2007
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    Hier nochmal in c aber c++ ist ja abwertskompatibel.
    Code:
    do 
    {
            printf("%i", (test&1));
    }while(test/=2);
    
    Bei meiner version sparst du dir ram :)

    Aber jetzt für die erfahreneren unter euch, machts einen unterschied, ob man in dem fall test&1 oder test%2 schreibt? Ich mein von performance gründen.

    Ist das bit shiften bei (mid/high/low)endian überhaupt zulässig?
     
  10. #9 Lesco, 16.06.2007
    Zuletzt bearbeitet: 16.06.2007
    Lesco

    Lesco segmentation fault

    Dabei seit:
    18.12.2005
    Beiträge:
    67
    Zustimmungen:
    0
    Ort:
    Hessen
    Ja, das macht einen Unterschied: Der &-Operator braucht nur eine Anweisung, die sehr wenig Takte benötigt: "and". Bei dem Modulo-Operator hängt das verwendete von den Optimierungen ab. Das "intuitivste" wäre die div-Instruktion, die jedoch eine ziemlich langsame(über 50 Takte) und im Vergleich wesentlich "kompliziertere" Operation ist, als ein simples "and eax,1".
    Jedoch verwenden heute viele Kompiler die div-Anweisung nurnoch, wenn es gar nicht anders geht und Division und Reste werden bei konstantem Divisor meist durch "reciprocal multiplication"(~Mit dem Kehrwert multiplizieren) gelöst(Da man keine Kommazahlen hat ohne die FPU zu nutzen, greift man auf "fixed-point arithmetic" zurück, d.h. "man denkt sich" den Teil vor dem Komma in edx und den Komma-Anteil in eax). Das ist aber trotzdem noch aufwendiger. Zur Verdeutlichung hier einmal was gcc aus int x = y/3; macht:
    Code:
    8048335:       c7 45 f4 b3 15 00 00    mov    DWORD PTR [ebp-12],0x15b3
     804833c:       8b 45 f4                mov    eax,DWORD PTR [ebp-12]
     804833f:       89 45 e8                mov    DWORD PTR [ebp-24],eax
     8048342:       c7 45 e4 56 55 55 55    mov    DWORD PTR [ebp-28],0x55555556
     8048349:       8b 45 e4                mov    eax,DWORD PTR [ebp-28]
     804834c:       f7 6d e8                imul   DWORD PTR [ebp-24]
     804834f:       89 d1                   mov    ecx,edx
     8048351:       8b 45 e8                mov    eax,DWORD PTR [ebp-24]
     8048354:       c1 f8 1f                sar    eax,0x1f
     8048357:       89 ca                   mov    edx,ecx
     8048359:       29 c2                   sub    edx,eax
     804835b:       89 d0                   mov    eax,edx
     804835d:       89 45 f8                mov    DWORD PTR [ebp-8],eax
    
    Aus dem selben Grund sollte man statt test/=2 auch lieber test>>=1 schreiben.(Es kann aber auch sein, dass der Kompiler das von selbst optimiert)

    Edit: Ich habe gerade nochmal nachgeschaut: dpkg hat recht, test%2 wird von gcc durch ein and ersetzt, allerdings stehen noch eine Menge Operationen mehr drin als bei einem test&1:
    (gcc-version: 4.2.0, keine extra Optionen beim kompilieren)
    test%2:
    Code:
    804833c:       8b 55 f4                mov    edx,DWORD PTR [ebp-12]
    804833f:       89 d0                   mov    eax,edx
    8048341:       c1 f8 1f                sar    eax,0x1f
    8048344:       89 c1                   mov    ecx,eax
    8048346:       c1 e9 1f                shr    ecx,0x1f
    8048349:       8d 04 0a                lea    eax,[edx+ecx]
    804834c:       83 e0 01                and    eax,0x1
    804834f:       29 c8                   sub    eax,ecx
    8048351:       89 45 f8                mov    DWORD PTR [ebp-8],eax
    
    test&1:
    Code:
    804833c:       8b 45 f4                mov    eax,DWORD PTR [ebp-12]
    804833f:       83 e0 01                and    eax,0x1
    8048342:       89 45 f8                mov    DWORD PTR [ebp-8],eax
    
     
  11. dpkg

    dpkg Mitglied

    Dabei seit:
    21.04.2007
    Beiträge:
    46
    Zustimmungen:
    0
    Ort:
    Linz
    Ob du test&1 oder test%2 schreibst, sollte bei einem gutem Compiler( was der gcc ja ist ) egal sein.

    Ja, denn high/low endian sagt nur etwas darüber aus, wie die zahl im arbeitsspeicher abgelegt ist, geshiftet wird aber sowieso im Register.
     
  12. #11 Lesco, 16.06.2007
    Zuletzt bearbeitet: 16.06.2007
    Lesco

    Lesco segmentation fault

    Dabei seit:
    18.12.2005
    Beiträge:
    67
    Zustimmungen:
    0
    Ort:
    Hessen
    [Haarspalterei] Es wird nicht immer im Register geshiftet:
    Aus t>>=3 wird:[/Haarspalterei]
    Code:
     sar    DWORD PTR [ebp-8],0x3
    
    Aber dennoch kümmert sich der Prozessor um die Endianess und sorgt dafür, dass die Bits richtig verschoben werden, daher spielt es keine Rolle ob es sich um high oder low endian handelt.
     
  13. dpkg

    dpkg Mitglied

    Dabei seit:
    21.04.2007
    Beiträge:
    46
    Zustimmungen:
    0
    Ort:
    Linz
    [OT]Was heisst eigentlich mid endian?[/OT]
     
  14. #13 marcellus, 17.06.2007
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    Hab ich einmal irgendwo gelesen, bin mir jetzt aber auch nicht mehr sicher wo.

    bei google ist das rausgekommen http://computing-dictionary.thefreedictionary.com/middle-endian

    Ich dachte ein moderner cpu kann modulo in einem takt berechnen, ist das dann das wo sse usw zum tragen kommt?
     
  15. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  16. #14 marcellus, 18.06.2007
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    @Lesco mit welcher option bekommt man den assembler output, ich hab das gcc manual durchgesehen, aber ich find das irgendwie nicht. Ich glaub das wär eine gute idee um zu schauen was schneller läuft.

    Jede assembler zeile braucht einen Takt oder?
     
  17. musiKk

    musiKk Dr. Strangelove

    Dabei seit:
    30.07.2006
    Beiträge:
    264
    Zustimmungen:
    0
    Ort:
    Leipzig
    Ich zitiere "man gcc"
    Nein, jede Zeile stellt einen Befehl an die CPU dar und jeder Befehl besteht aus einer bestimmten Zahl an Takten. Dabei kommts auch auf die CPU an, bei CISC-CPUs gibt es sehr viele umfangreiche Befehle, die durchaus "einige Dutzend Takte" (wie mein Prof. immer zu sagen pflegte...) benoetigen.
     
Thema:

short int vs int Probleme

Die Seite wird geladen...

short int vs int Probleme - Ähnliche Themen

  1. CentOS 7 Gnome Application shortcut+Icon

    CentOS 7 Gnome Application shortcut+Icon: Hi ich bin gerade von Ubuntu nach CentOS megriert und wollte mir das erste mal auf meinen neuen System unter Anwendungen>Entwicklung einen Eintrag...
  2. GNOME3 - SUPER-Keys Windows tasten shortcuts

    GNOME3 - SUPER-Keys Windows tasten shortcuts: Hallo, wollte mal fragen ob das jemand hinbekommen hat bei gnome3 Shortcuts mit der windowstaste zum laufen zu bekommen? Es geht zwar, das man...
  3. Shortcut unter CentOS ändern, nur wo?

    Shortcut unter CentOS ändern, nur wo?: Hallo, ich arbeite auf einer Workstation, auf der CentOS läuft. Wenn ich hier das * im Nummernblock drücke, öffnet sich immer die Applikation...
  4. keyboard shortcuts

    keyboard shortcuts: hallo.. wie kann ich unter gnome eigene befehle mit shortcuts belegen? z.b. 'firefox ebay.de' auf alt+e
  5. [Shortcut?] Gnome: Arbeitsflächenumschalter

    [Shortcut?] Gnome: Arbeitsflächenumschalter: Hallo, gibt's eine Tastenkombo zum Switchen der Arbeitsflächen? Müsste das nicht [Strg] + 1,2,3,4 sein? Gruß DIzzy