Page 1 sur 1

Signer ses entiers

Posté : 04 févr. 2009, 20:27
par katagoto
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

Re: Signer ses entiers

Posté : 04 févr. 2009, 21:51
par Victor BRITO
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.

Posté : 04 févr. 2009, 22:21
par naholyr
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.

Posté : 05 févr. 2009, 02:04
par rolusseum
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

Posté : 05 févr. 2009, 02:55
par Sékiltoyai
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…

Posté : 05 févr. 2009, 12:45
par katagoto
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

Posté : 05 févr. 2009, 13:49
par Calimero
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+$/

Posté : 05 févr. 2009, 13:51
par katagoto
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

Posté : 05 févr. 2009, 15:32
par naholyr
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().