IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Utilisation des entiers (longs) et int64


Sujet :

Lazarus Pascal

  1. #1
    Invité
    Invité(e)
    Par défaut Utilisation des entiers (longs) et int64
    Bonjour,

    Uniquement par curiosité : je travaillais ce matin sur des int64.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    unit Unit1; 
    {$mode objfpc}{$H+}  
    [...]
    procedure TForm1.Button1Click(Sender: TObject); 
    var
      aSize : int64;
      i : integer;
    begin
      i := 259;
      aSize := i*1024*1024*1024;
      showmessage(IntToStr(aSize));
    end;
    --> -1073741824. Résultat faux. Nécessite un transtypage de i.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    unit Unit1; 
    {$mode objfpc}{$H+}  
    [...]
    procedure TForm1.Button2Click(Sender: TObject); 
    var
      aSize : int64;
      i : integer;
      iTmp64 : int64;
    begin
      i := 259;
      iTmp64 := i;
      aSize := iTmp64*1024*1024*1024;
      showmessage(IntToStr(aSize));
    end;
    --> 278099132416. Résultat correct.

    Par défaut, dans mon programme, i est un integer de type "32-bit"
    Donc, en résumé, il y a incompatibilité entre les integer (longint) et les int64...

    Le type des "1024" utilisés dans mes formules de calcul sont correctement interprétés qu'il s'agisse de calculs en 32 bits ou en 64 bits. Le type de "1024" c'est quoi ?

    Cordialement. Gilles
    Dernière modification par Invité ; 02/02/2011 à 12h14.

  2. #2
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 415
    Points
    59 415
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Soit dit en passant, un simple transtypage éviterait la variable iTmp64 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    aSize := Int64(i) * 1024 * 1024 * 1024;
    L'output Assembleur est assez parlant.
    Avec le transtypage :
    Code ASM : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # [11] aSize := Int64(i) * 1024 * 1024 * 1024;
    	movswl	U_P$_I,%edx
    	movl	%edx,%eax
    	sarl	$31,%eax
    	shldl	$10,%edx,%eax
    	shll	$10,%edx
    	shldl	$10,%edx,%eax
    	shll	$10,%edx
    	shldl	$10,%edx,%eax
    	shll	$10,%edx
    	movl	%edx,U_P$_ASIZE
    	movl	%eax,U_P$_ASIZE+4

    Et sans le transtypage :
    Code ASM : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # [11] aSize := i * 1024 * 1024 * 1024;
    	movswl	U_P$_I,%eax
    	shll	$10,%eax
    	shll	$10,%eax
    	shll	$10,%eax
    	movl	%eax,%edx
    	sarl	$31,%edx
    	movl	%eax,U_P$_ASIZE
    	movl	%edx,U_P$_ASIZE+4

    Les "* 1024" sont traduits en shifts sur 8 octets, ce qui est une belle optimisation. Pour un autre nombre, c'est la fonction fpc_mul_int64 qui est appelée.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Points : 506
    Points
    506
    Par défaut
    Si tu actives les conseils (hint) du compilateur (option -vh) tu auras un message t'indiquant une risque de débordement.

    A priori le compilateur évalue les expressions en 32 bits et ne passe en 64 bits que si une variable 64 bits y figure.

    Enfin si tu actives les contrôles de débordement d'entier (-Co) ton code devrait générer une erreur (si je ne me suis pas planté dans mon test).

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Merci de vos réponses à tous 2. Je dois reconnaître que je ne travaille pas en int64 tous les jours. Par contre, j'ai pris le temps de regarder la Doc et là... hormis des bugs Qword<-->int64 qui seront (sont) réglés en fpc 2.5.1, et quelques "renseignements" qui ne m'ont pas été utiles, je n'ai même pas vu la fonction de transtypage Int64... Il est vrai aussi, que je ne rends pas assez bavarde la compilation... Je la trouve souvent d'ailleurs "désagréable" telle qu'elle est réglée par défaut : elle me rend compte par exemple depuis hier que "resume" serait deprecated dans les threads. Je vais encore me perdre dans la Doc...

    Cordialement

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Points : 506
    Points
    506
    Par défaut
    Int64 n'est pas une fonction c'est un transtypage. Un transtypage se fait sur le modèle suivant :

    nom_du_type(variable_ou_valeur)

    Ça à l'apparence d'un appel de fonction mais ça n'en est pas un.

    Plus d'info dans les sections 9.4, 9.5 et 9.6 du "Free Pascal : Reference guide".

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Certainement... Je n'en suis pas là (malheureusement) et je ne comprends pas vraiment la nuance* : un transtypage, cela ne tombe pas du ciel. Cela doit bien faire appel à un bout de programme, quelque soit le langage utilisé... C'est une première "impression" car en vérité je n'ai jamais réfléchi à la nature des "outils" de transtypage...

    Quant à la Doc : nul n'est certainement l'ignorer... Mais quand on y cherche une précision et encore plus quand on n'a pas de piste, son utilisation ne me semble pas particulièrement ergonomique et peu efficiente...

    *Je note cela... à approfondir plus tard.

    Merci pour tous ces renseignements.
    Bonne journée.
    Cordialement. Gilles
    Dernière modification par Invité ; 04/02/2011 à 15h31. Motif: Orthographe

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/12/2011, 11h29
  2. Réponses: 4
    Dernier message: 03/07/2011, 17h50
  3. n'utiliser que des entiers dans un textbox
    Par MkcookieFIFO dans le forum Windows Forms
    Réponses: 4
    Dernier message: 17/05/2010, 10h48
  4. Utilisation des types entier non signés dans Win32
    Par colorid dans le forum Langage
    Réponses: 1
    Dernier message: 18/12/2009, 10h04
  5. Quel langage pour manipuler des entiers très longs ?
    Par mis_dj dans le forum Langages de programmation
    Réponses: 8
    Dernier message: 10/05/2006, 21h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo