Richtiges Casten von unsigned long long



  • Hallo

    Verwende unsigned 64 Bit Integers und suche nach der korrekten Typdefinition und dem korrekten Casting:

    // Typdefinition 1
    typedef unsigned __int64 bitboard_tt;
    
    // Typdefinition 2
    typedef unsigned long long bitboard_t;
    
    // Helper
    inline int square_is_ok(int square)
    {
      return square >= 0 && square <= 63;
    }
    
    // Casting 1
    inline bitboard_t square_to_bitboard(int square)
    {
      assert(square_is_ok(square));
      return 1ULL << static_cast<bitboard_t>(square);
    }
    
    // Casting 2
    inline bitboard_t square_to_bitboard(int square)
    {
      assert(square_is_ok(square));
      return static_cast<bitboard_t>(1) << static_cast<bitboard_t>(square);
    }
    
    // Casting 3
    inline bitboard_t square_to_bitboard(int square)
    {
      assert(square_is_ok(square));
      return bitboard_t(1) << bitboard_t(square);
    }
    
    // Casting 3
    inline bitboard_t square_to_bitboard(int square)
    {
      assert(square_is_ok(square));
      return (bitboard_t) 1 << (bitboard_t) square;
    }
    

    🙄

    Gruss



  • Die Frage ist auch vom verwendeten Compiler abhängig.

    Der Typ __int64 gilt nur unter Windows. Falls es portabel sein soll, so ist sicherlich die zweite Methode am besten.

    long long int wird jedoch erst ab MSVC7 unterstützt. Oder du verwendest den GCC der nimmt diesen Typ problemlos.

    In der Standardlibrary stdint.h ist außerdem der Typ uint64_t definiert. Probiere den mal aus der ist Bestandteil von C99. Fall die Library nicht bei MSVC6 dabei ist, so kann sie auch nachrüsten.

    Gruß
    trooper



  • trooper schrieb:

    long long int wird jedoch erst ab MSVC7 unterstützt.

    Ich hoffe doch mal, dass keiner so wahnsinnig ist und heute noch ne ältere Version verwendet 😮



  • Michael E. schrieb:

    Ich hoffe doch mal, dass keiner so wahnsinnig ist und heute noch ne ältere Version verwendet 😮

    Du wärst erstaunt. er. Natürlich will das eigentlich keiner, aber wenn du ne alte Codebase hast, die neuere Compiler überhaupt nicht mehr fressen, ist es schwer, dem Chef klar zu machen, dass das ganze ein großer Haufen Mist ist der schnellstmöglich entsorgt und durch etwas brauchbares ersetzt gehört - das kostet nämlich Zeit (und Zeit ist Geld).

    Ist aber in diesem Fall auch nebensächlich, stdint.h kann MSVC nämlich bis mindestens 2008 nicht (2010 hatte ich noch nicht unter den Fingern). Es gibt ein Projekt, dass die damit verbundenen Header nachbaut, aber wenn man sich davon nicht abhängig machen will, muss man das von Hand nachcoden. Nicht, dass es besonders schwer wäre:

    #ifdef _MSC_VER
    namespace util {
      typedef __int8 int8_t;
      typedef unsigned __int8_t int8_t;
    
      // ...
    }
    #else
    #include <tr1/cstdint>
    
    namespace util {
      using ::std::tr1::int8_t;
      using ::std::tr1::uint8_t;
      // ...
    }
    #endif
    


  • Afaik liefert boost mit dem cstdint.hpp Header eine recht weitreichende Abdeckung der ganzen cstdint-Typen.


Anmelden zum Antworten