1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Microsoft mag keine 64-bit typedefs?

    • Frage
  • Sysmaniac
  • 10. März 2006 um 08:16
  • Unerledigt
  • Sysmaniac
    6
    Sysmaniac
    Mitglied
    Reaktionen
    1
    Punkte
    301
    Beiträge
    53
    • 10. März 2006 um 08:16
    • #1

    Hi allerseits,

    Waehrend ich mit MS Visual Studio an C-Code gearbeitet habe bin ich ueber einen merkwuerdigen Fehler mit 64 bit integers gestolpert:

    Folgendes Codefragment liefert statt der erwarteten Ausgabe "2,3" den Unsinn "2,0" zurueck.

    Code
    typedef struct{
      unsigned __int64 top;
      unsigned __int64 bot;
    } large_type;
    
    
    int main(int argc, char **argv){
    
    	large_type bad = {2,3};
    	printf( "bad is: %llu, %llu\n", bad.top, bad.bot);
    }
    Alles anzeigen

    Wenn ich 32 bit integers statt 64 verwende ist alles okay, auch einzelne 64 bit integers (ohne typedef) funktionieren problemlos.

    gcc macht keine Probleme mit sowas, aber nachdem es mich einen ganzen Tag gekostet hat diesen Fehler zu finden ist es halt etwas unbefriedigend jetzt einfach den Kompiler zu wechseln ohne zu wissen was der Hintergrund ist.

    Habt ihr irgendeine Ahnung, woran das liegen koennte?

    lg
    Sys

    Any sufficiently advanced technology is indistinguishable from magic.
    Arthur C. Clarke

  • hal
    32
    hal
    Mitglied
    Reaktionen
    52
    Punkte
    11.122
    Beiträge
    2.208
    • 10. März 2006 um 12:12
    • #2

    Bug reports zum Visual C++-Compiler solltest du eher an Microsoft schicken als ans Informatik-Forum...

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • kubuntu
    6
    kubuntu
    Mitglied
    Reaktionen
    2
    Punkte
    352
    Beiträge
    65
    • 10. März 2006 um 23:49
    • #3

    Unter Visual Studio 2005 scheint der Fehler gefixt zu sein.


  • Sysmaniac
    6
    Sysmaniac
    Mitglied
    Reaktionen
    1
    Punkte
    301
    Beiträge
    53
    • 14. März 2006 um 21:39
    • #4

    Es duerfte sich dabei um einen Bug in der Funktion printf handeln, das anscheinend nicht mehr als ein 64-bit Argument vertraegt.

    Wen man die beiden integers einzeln ausgibt funktionierts:

    Code
    printf( "bad.top is: %llu, ", bad.top);
    printf( "bad.bot is: %llu\n", bad.bot);

    Kleine Ursache, grosse Wirkung! :thumb:

    lg
    Sys

    Any sufficiently advanced technology is indistinguishable from magic.
    Arthur C. Clarke

  • hal
    32
    hal
    Mitglied
    Reaktionen
    52
    Punkte
    11.122
    Beiträge
    2.208
    • 15. März 2006 um 01:30
    • #5

    Könnte auch ein Problem mit varargs und 64bit-Typen sein.

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • Sysmaniac
    6
    Sysmaniac
    Mitglied
    Reaktionen
    1
    Punkte
    301
    Beiträge
    53
    • 28. März 2006 um 22:26
    • #6

    Das Problem sind unterschiedliche Format specifier fuer 64-bit Integers.

    gcc erwartet:

    Code
    printf( "myInt is: %[B]llu[/B]", myInt);

    der MS Visual Studio compiler will:

    Code
    printf( "myInt is: %[B]I64u[/B]", myInt);

    Das Gemeine daran ist, dass Visual Studio %llu akzeptiert, es aber offenbar wie %lu (also 32-bit behandelt). Bei den kleinen Werten die ich zum Testen verwendet habe faellt das nicht auf, solange ich keine zweites Argument uebergeben habe. Dann wurden statt dem zweiten Argument die oberen 32-bit des ersten Arguments vom Stack geholt und die waren eben Null.

    Kleinigkeit wenn man's weiss! :)

    lg
    Sys

    Any sufficiently advanced technology is indistinguishable from magic.
    Arthur C. Clarke

  • Maximilian Rupp 27. Dezember 2024 um 12:06

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Rechtliches

Impressum

Datenschutzerklärung