Signer ses entiers

Mammouth du PHP | 1668 Messages

04 févr. 2009, 20:27

Bonjour à toutes et à tous,

J'aimerais savoir comment je pourrais signer, simplement et nativement mes entiers, j'ai déjà tenté (signed int) / (signed integer), oh, la belle parse error...

Par avance merci de votre aide

PS : j'ai hâte que le type hinting facultatif de conversion arrive
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

Mammouth du PHP | 2937 Messages

04 févr. 2009, 21:51

j'ai déjà tenté (signed int) / (signed integer), oh, la belle parse error...
Le manuel de PHP, au chapitre manipulation des types n'en dit mot, apparemment : on n'y lit que (int) et (integer). :-k

À moins de coder une fonction satisfaisant ton besoin, je ne vois pas de solution.

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

04 févr. 2009, 22:21

Un entier est unsigned en PHP, il n'existe pas d'entier signé. Je comprends qu'on veuille aller au-delà des 2 milliards, mais hélas tu ne pourras pas ;)

Une des (nombreux) défauts de notre langage favori.

Eléphant du PHP | 139 Messages

05 févr. 2009, 02:04

J'aimerais savoir comment je pourrais signer, simplement
Si ça peut vous intéresser, un lien qui propose une fonction (pas simple)
http://forum.hardware.fr/hfr/Programma ... 824_1.htm

ViPHP
ViPHP | 5924 Messages

05 févr. 2009, 02:55

Un entier est unsigned en PHP, il n'existe pas d'entier signé. Je comprends qu'on veuille aller au-delà des 2 milliards, mais hélas tu ne pourras pas ;)
Euh, non c'est précisément le contraire…
En PHP, tous les entiers sont signés. Et d'ailleurs je ne comprends pas la question. Dans la mesure où si tu fais $machin = -$machin; , quelquesoit le contenu de ta variable, tu obtiendras son inverse. Je ne vois donc pas où se situe ton problème…

Mammouth du PHP | 1668 Messages

05 févr. 2009, 12:45

Pour la fonction, c'est pas dûr :
$positif = $negatif >= 0 ? $regatif : -$negatif;
Je trouve ça légèrement lourd à mon gout, et non, je ne veux pas aller jusqu'à 2.000.000.000, je veux juste éviter que les membres évite d'entrer des entier négatif pour un id par exemple...

Vu qu'il n'y semble pas y avoir de solution, pour l'instant...

Merci à tous
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

ViPHP
ViPHP | 2287 Messages

05 févr. 2009, 13:49

Je trouve ça légèrement lourd à mon gout, et non, je ne veux pas aller jusqu'à 2.000.000.000, je veux juste éviter que les membres évite d'entrer des entier négatif pour un id par exemple...
une petite regexp ?

Code : Tout sélectionner

/^\d+$/
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Mammouth du PHP | 1668 Messages

05 févr. 2009, 13:51

encore plus, le but était de renforcer la sécurité sans trop altérer les performances, d'où ma demande de solution native...

Mais merci quand même
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

05 févr. 2009, 15:32

Un entier est unsigned en PHP, il n'existe pas d'entier signé. Je comprends qu'on veuille aller au-delà des 2 milliards, mais hélas tu ne pourras pas ;)
Euh, non c'est précisément le contraire…
En PHP, tous les entiers sont signés. Et d'ailleurs je ne comprends pas la question. Dans la mesure où si tu fais $machin = -$machin; , quelquesoit le contenu de ta variable, tu obtiendras son inverse. Je ne vois donc pas où se situe ton problème…
En effet j'avais inversé, tous les entiers PHP sont signés, et il est impossible de lui faire manipuler des entiers non signés.
Tu ne vois pas problème ? Un entier non signé peut être deux fois plus gros qu'un entier signé, puisqu'ils sont tous deux sur 32 bits, sauf qu'un entier signé doit en plus porter l'information du signe (heureusement qu'un bit suffit pour ça) et sa valeur absolue ne tient donc que sur 31 bits.
Maximum d'un entier signé : 2^31-1
Maximum d'un entier non signé : 2^32-1
Et comme on n'a pas non plus de notion de bigint, on est niqué de toute façon.

Essaie de faire un intval(3000000000) pour rigoler ;)

Après si c'est juste pour être sûr d'avoir un nombre positif, aucun intérêt de se poser la question du type, signe-le simplement en positif en prenant sa valeur absolue avec abs().