Le type @bigint
17.1 Constante littérale
Utiliser le suffixe «G » pour définir une constante littérale de type @bigint :
@bigint a = 1234567890_1234567890_1234567890_G
message [a string] + "\n" # 123456789012345678901234567890
Vous pouvez utiliser le caractère de soulignement « _» pour séparer les chiffres.
Avec le préfixe «0x», vous pouvez écrire les nombres en héxadécimal :
@bigint a = 0x123456789ABCDEF0_123456789abcdefG
message [a hexString] + "\n" # 0x123456789ABCDEF0_123456789ABCDEF
Les lettres minuscules «a» à «f» et majuscules «A» à «F» sont utilisées pour définir les constantes entières en héxadécimal.
17.2 Construction
Le type @bigint ne définit que deux constructeurs :
• constructeur zerodu type@bigint (page 166);
1.http://www.gmplib.org.
• constructeur defaultdu type@bigint (page 166).
Ces deux constructeurs renvoient un @bigint initilisé à0.
Pour construire un @bigint, vous pouvez aussi utiliser lesgetterssuivants :
• getter bigintdu type@bool (page 210) ;
• getter bigintdu type@sint (page 237) ;
• getter bigintdu type@sint64 (page 243) ;
• getter bigintdu type@uint (page 283) ;
• getter bigintdu type@uint64 (page 292).
17.2.1 Constructeur zero
constructor @bigint zero -> @bigint
Le constructeur zero renvoie un @bigint initialisé à zéro :
@bigint a = .zero
message [a string] + "\n" # 0
17.2.2 Constructeur default
constructor @bigint default -> @bigint
Le constructeur default, comme le constructeur zero, renvoie un @bigint initialisé à zéro :
@bigint a = .default
message [a string] + "\n" # 0
17.3 Comparaison
Le type @bigint implémente les six opérateurs de comparaison ==, !=, <, <=, >
et >=. Il implémente aussi les getters isZero et sign qui permettent de comparer un @bigint avec zéro.
17.4. CONVERSIONS 167
17.3.1 Opérateurs infixés de comparaison
operator @bigint == @bigint -> @bool operator @bigint != @bigint -> @bool operator @bigint >= @bigint -> @bool operator @bigint > @bigint -> @bool operator @bigint <= @bigint -> @bool operator @bigint < @bigint -> @bool
17.3.2 Getter isZero
getter @bigint isZero -> @bool
Cegetter renvoie true si valeur du récepteur est nulle, et false dans le cas contraire.
message [[0G isZero] ocString] + "\n" # YES message [[1G isZero] ocString] + "\n" # NO
17.3.3 Getter sign
getter @bigint sign -> @sint
Ce getter renvoie :
• -1S si la valeur du récepteur est strictement négative ;
• 0S si la valeur du récepteur est nulle ;
• 1S si la valeur du récepteur est strictement positive.
message [[0G sign] >= 0S ocString] + "\n" # YES message [[1G sign] < 0S ocString] + "\n" # NO
17.4 Conversions
Lesgetters suivants permettent de convertir un @bigint dans un type entier usuel :
• getter sintdu type@bigint (page 170) ;
• getter sint64du type@bigint (page 171) ;
• getter uintdu type@bigint (page 171) ;
• getter uint64du type@bigint (page 171).
Ils échouent si le récepteur ne peut pas être converti sans perte. On peut utiliser les getterssuivants pour vérifier préalablement si une conversion est possible :
• getter bitCountForSignedRepresentationdu type@bigint(page 168) ;
• getter bitCountForUnsignedRepresentationdu type@bigint(page 168) ;
• getter fitsInSIntdu type@bigint (page 169) ;
• getter fitsInSInt64du type@bigint (page 169) ;
• getter fitsInUIntdu type@bigint (page 170) ;
• getter fitsInUInt64du type@bigint (page 170).
17.4.1 Getter bitCountForSignedRepresentation
getter @bigint bitCountForSignedRepresentation -> @uint
Ce getter permet de connaître le nombre de bits nécessaires pour écrire la valeur du récepteur dans la représentation binairecomplément à deux.
message [[0G bitCountForSignedRepresentation] string] + "\n" # 1 message [[1G bitCountForSignedRepresentation] string] + "\n" # 2 message [[-1G bitCountForSignedRepresentation] string] + "\n" # 1 message [[0x8000G bitCountForSignedRepresentation] string] + "\n" # 17 message [[-0x8000G bitCountForSignedRepresentation] string] + "\n" # 16
Pour connaître le nombre d’octets nécessaires pour représenter la valeur du récepteur dans la représentation binairecomplément à deux, on calcule :
([bigint bitCountForSignedRepresentation] - 1) / 8 + 1
Et pour le nombre de mots de 32 bits :
([bigint bitCountForSignedRepresentation] - 1) / 32 + 1
17.4.2 Getter bitCountForUnsignedRepresentation
17.4. CONVERSIONS 169 getter @bigint bitCountForUnsignedRepresentation -> @uint
Cegetterpermet de connaître le nombre de bits nécessaires pour écrire la valeur absolue du récepteur dans la représentation binairenaturelle.
message [[0G bitCountForUnsignedRepresentation] string] + "\n" # 1 message [[1G bitCountForUnsignedRepresentation] string] + "\n" # 1 message [[-1G bitCountForUnsignedRepresentation] string] + "\n" # 1 message [[0x8000G bitCountForUnsignedRepresentation] string] + "\n" # 16 message [[-0x8000G bitCountForUnsignedRepresentation] string] + "\n" # 16
Comme c’est la valeur absolue qui est prise en compte, le signe n’intervient pas.
Pour connaître le nombre d’octets nécessaires pour représenter la valeur absolue du récepteur dans la représentation binairenaturelle, on calcule :
([bigint bitCountForUnsignedRepresentation] - 1) / 8 + 1
Et pour le nombre de mots de 32 bits :
([bigint bitCountForUnsignedRepresentation] - 1) / 32 + 1
17.4.3 Getter fitsInSInt
getter @bigint fitsInSInt -> @bool
Ce getter permet de savoir si le récepteur peut être converti en @sint. Pour effectuer la conversion, utilisez le getter sintdu type@bigint (page 170).
message [[0x1234_5678G fitsInSInt] ocString] + "\n" # YES message [[0x7FFF_FFFFG fitsInSInt] ocString] + "\n" # YES message [[0x8000_0000G fitsInSInt] ocString] + "\n" # NO message [[-0x8000_0000G fitsInSInt] ocString] + "\n" # YES message [[-0x8000_0001G fitsInSInt] ocString] + "\n" # NO
17.4.4 Getter fitsInSInt64
getter @bigint fitsInSInt64 -> @bool
Cegetterpermet de savoir si le récepteur peut être converti en @sint64. Pour effectuer la conversion, utilisez le getter sint64du type@bigint (page 171).
message [[0x1234_5678_9ABC_DEF0G fitsInSInt64] ocString] + "\n" # YES message [[0x7FFF_FFFF_FFFF_FFFFG fitsInSInt64] ocString] + "\n" # YES message [[0x8000_0000_0000_0000G fitsInSInt64] ocString] + "\n" # NO message [[-0x8000_0000_0000_0000G fitsInSInt64] ocString] + "\n" # YES message [[-0x8000_0000_0000_0001G fitsInSInt64] ocString] + "\n" # NO
17.4.5 Getter fitsInUInt
getter @bigint fitsInUInt -> @bool
Ce getter permet de savoir si le récepteur peut être converti en @uint. Pour effectuer la conversion, utilisez le getter uintdu type@bigint (page 171).
message [[0x1234_5678G fitsInUInt] ocString] + "\n" # YES message [[0x1234_5678_9G fitsInUInt] ocString] + "\n" # NO message [[-1G fitsInUInt] ocString] + "\n" # NO
17.4.6 Getter fitsInUInt64
getter @bigint fitsInUInt64 -> @bool
Cegetterpermet de savoir si le récepteur peut être converti en @uint64. Pour effectuer la conversion, utilisez le getter uint64du type@bigint (page 171).
message [[0x1234_5678_9ABC_DEF0G fitsInUInt64] ocString] + "\n" # YES message [[0x1234_5678_9ABC_DEF0_1G fitsInUInt64] ocString] + "\n" # NO message [[-1G fitsInUInt64] ocString] + "\n" # NO
17.4.7 Getter sint
getter @bigint sint -> @sint
Cegetterpermet de convertir le récepteur en @sint. Si la conversion n’est pas possible, un message d’erreur est affiché et la valeur renvoyée n’est pas construite. On peut tester si la conversion est possible en appelant le getter fitsInSInt du type @bigint (page 169) .
17.4. CONVERSIONS 171 message [[-0x1234_5678G sint] hexString] + "\n" # 0xEDCBA988
17.4.8 Getter sint64
getter @bigint sint64 -> @sint64
Ce getter permet de convertir le récepteur en @sint64. Si la conversion n’est pas possible, un message d’erreur est affiché et la valeur renvoyée n’est pas construite.
On peut tester si la conversion est possible en appelant legetter fitsInSInt64du type
@bigint(page 169).
message [[-0x1234_5678_9ABC_DEF0G sint64] hexString] + "\n" # 0xEDCBA98765432110
17.4.9 Getter uint
getter @bigint uint -> @uint
Cegetterpermet de convertir le récepteur en @uint. Si la conversion n’est pas possible, un message d’erreur est affiché et la valeur renvoyée n’est pas construite. On peut tester si la conversion est possible en appelant le getter fitsInUInt du type @bigint (page 170) .
message [[0x1234_5678G uint] hexString] + "\n" # 0x12345678
17.4.10 Getter uint64
getter @bigint uint64 -> @uint64
Ce getter permet de convertir le récepteur en @uint64. Si la conversion n’est pas possible, un message d’erreur est affiché et la valeur renvoyée n’est pas construite.
On peut tester si la conversion est possible en appelant legetter fitsInUInt64du type
@bigint(page 170).
message [[0x1234_5678_9ABC_DEFG uint64] hexString] + "\n" # 0x123456789ABCDEF