Int64 non signés sous delphi 2009

Résolu
Signaler
Messages postés
22
Date d'inscription
mercredi 25 décembre 2002
Statut
Membre
Dernière intervention
26 janvier 2009
-
Messages postés
22
Date d'inscription
mercredi 25 décembre 2002
Statut
Membre
Dernière intervention
26 janvier 2009
-
bonjour à tous,

ma question:
 --> j'aimerais savoir si Delphi 2009 permet l'utilisation d'entier64 bits non signés

 genre 'UnsignedInt64' ou approchant comme en C++

le pourquoi de cette question:
--> ceci pour permettre des opérations scalaires sur de grands entiers 64 bits  toujours positifs, et autoriser l'utilisation, sans restriction, de l'algèbre de Boole sur ces entiers.

NB: utilisation de BitBoard par exemple

en vous remerciant pour vos conseils et l'attention que vous porterez à cette question de programmeur candide

Themistocle

9 réponses

Messages postés
3792
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
9
Déclare tout simplement un nouveau type :

AbsInt64=0..High(Int64);

En fait, tu redéfinis Int64 sur un nouvel ensemble de définition (de 0 au maximum de Int64).
Ici, AbsInt64 va de 0 à 2^64.

Les problèmes commencent si tu veux créer des entiers plus grands que Int64 (genre de 0 à 2^128).

Voilà ...

Cordialement, Bacterius !
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
non

si tu definit un type : 0..High(Int64) tu crée un interval de 0 a 2^63 et non de 0 a 2^64-1

donc le mieux est d'utiliser le type UInt64 definit dans l'unité System

<hr size="2" width="100%" />
Messages postés
22
Date d'inscription
mercredi 25 décembre 2002
Statut
Membre
Dernière intervention
26 janvier 2009

en fait j'ai trouvé le type UInt64  dans l'unité  System; { Predefined constants, types, procedures... }


la déclaration est la suivante:


{$EXTERNALSYM UInt64      'unsigned __int64' } {$OBJTYPENAME UInt64     'Buj'}


j'imagine donc que l'on est autorisé à utiliser le type  UInt64      comme équivalent du type  unsigned __int64


je reformule donc ma question de la manière suivant:


 "suis je dans l'erreur?"


amicalement à tous



Themistocle
Messages postés
22
Date d'inscription
mercredi 25 décembre 2002
Statut
Membre
Dernière intervention
26 janvier 2009

merci,
je vais essayer cette méthode.

amicalement

Themistocle
Messages postés
3792
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
9
Ah oui en effet, puisque [Intervalle négatif] a toujours [Intervalle positif] + 1 éléments.

Bon ben alors oui, donc il faut utiliser UInt64 alors

Cordialement, Bacterius !
Messages postés
22
Date d'inscription
mercredi 25 décembre 2002
Statut
Membre
Dernière intervention
26 janvier 2009

merci Foxi,
cependant mon essai d'utilisation d' UInt64 est resté lettre morte sous Delphi 2009
( je n'ai peut être pas su l'utiliser [javascript:Insert_Emoticon('/imgs2/smile_angry.gif'); ])
alors que la méthode de Bactérius semble parfaitement fonctionner.

 j'ai défini un type:

 Type Bitboard = 0..High(Int64);

 et j'ai réussi à utiliser les opérateurs binaires : And, Or, Not... ect
 j'ai également pu utiliser sans problème les shift right et  shift left ( biitboard :=bitboard <<60) par exemple marche.
j'ai même implémenté une peit fonction de rotation de bitboard faisant dérouler le bitboard... les bits qui disparaissent à droite réapparaissent à gauche sans élition ni effet de bord.

il est possible que cela ne fonctionne qu'en apparence, et que ce dernier bit (2^64 -1) me crée un affreux effet papillon. [javascript:Insert_Emoticon('/imgs2/smile_clown.gif'); ] dans le doute je vais réessayer Uint64,

mais pourtant, cela semble marcher... comment tester  le 64ième bit !
   ... en tout cas je suis prévenu...

merci à tous les deux pour votre aide Themistocle
Messages postés
3792
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
9
Vu que le maximum de mon type  0..High(Int64) est impair, tu auras probablement un décalage au bout d'un certain moment (mais un long ... long moment peut-être ...).
Mais à mon avis, la solution la plus pratique est tout de même celle de f0xi. Même si je ne trouve pas de UInt dans mes unités, mais c'est autre-chose.

Cordialement, Bacterius !
Messages postés
22
Date d'inscription
mercredi 25 décembre 2002
Statut
Membre
Dernière intervention
26 janvier 2009

  bactérius & foxi 
en effet  on trouve sur cette page:
--------------------------------------------------------------------------------------
var
  min, max : Int64;
begin
  // Set the minimum and maximum values of this data
type
  min := Low(Int64);
  max := High(Int64);
  ShowMessage('Min int64 value =
'+IntToStr(min));
  ShowMessage('Max int64 value =
'+IntToStr(max));
end;
, ----
[javascript:Insert_Emoticon('/imgs2/smile.gif'); ]... je vais pouvoir poursuivre

Themistocle

NB. pour ouvrir ce fichier j'ai simplement défini une variable Uint64 et , via le menu contextuel( clic droit sur "Uint64" ) j'ai sélectionné " rechercher le fichier sous le curseur" :
puis :"rechercher Uint64" dans ce fichier: les définitions existent bien aux ligne données ci dessus.
Messages postés
22
Date d'inscription
mercredi 25 décembre 2002
Statut
Membre
Dernière intervention
26 janvier 2009

pour en avoir le coeur net, j'ai utilisé une fonction :



function  _StrUInt64Digits(val: TBitboard; width: Integer; sign: Boolean): ShortString;




fortement (++) inspirée de l'homonyme du fichier system pour afficher , en string, la valeur de mes bitboards







avec le Type




TBitboard = 0..High(Int64)






:




mon code se plante dès la valeur 2^63 (incluse) et affiche des caractères aléatoires
( enfin pas vraiment aléatoires mais sans rapport avec un nombre )












avec le 


type TBitboard  =    UInt64 :







mon code fonctionne et affiche



18446744073709551615 pour  si mon bitboard vaut  2^64 -1

chapeau f0xi

Themistocle