OVH Cloud OVH Cloud

Opérateur * et Dépassement de capacité

11 réponses
Avatar
Curl
Bonjour..

Je commence à perdre les pédales.

Dim glong as Long
glong = 256 * 255

m'indique un dépassement de capacité .

Pourquoi ?

10 réponses

1 2
Avatar
Curl
Dim glong as long
glong = 256
glong = 255*glong
Fonctionne

ou encore
glong = clng(256)*clng(255)

ou encore
en déclarant 256 et 255 comment des constantes de type long ..

C'est logique, mais pas pratique..
Avatar
J-M Rabilloud [MVP]
Tu peux plus simplement

glong = 256& * 255

"Curl" a écrit :

Dim glong as long
glong = 256
glong = 255*glong
Fonctionne

ou encore
glong = clng(256)*clng(255)

ou encore
en déclarant 256 et 255 comment des constantes de type long ..

C'est logique, mais pas pratique..








Avatar
Patrice Henrio
Il semble que VB commence par évaluer le premier nombre et lui attribue un
type (ici 256 sera codé sur 2 octets et considéré comme signé (pourquoi ? je
ne sais pas). Ensuite il essaie de faire la multiplication en utilisant le
type du premier opérande et là cela ne tient plus (maximum possible =
128*255)
A mon avis il s'agit plutôt d'un bug de VB.
En effet si on remplace le deuxième opérande par un nombre décimal, il n'y a
pas de problèmes de transtypage.

"J-M Rabilloud [MVP]" a écrit
dans le message de news:

Tu peux plus simplement

glong = 256& * 255

"Curl" a écrit :

Dim glong as long
glong = 256
glong = 255*glong
Fonctionne

ou encore
glong = clng(256)*clng(255)

ou encore
en déclarant 256 et 255 comment des constantes de type long ..

C'est logique, mais pas pratique..










Avatar
le_troll
Bonjour, ça aussi ça, marche...

dim x as long
dim y as long
dim z as long
x = 256
y = 256
z = x * y

--
Merci, @+, bye, Joe
troll75 AROBASE iFrance POINT com
------------------------------------------
Le_Troll, éleveur de Trolls depuis César, qui disait:
Avec une hache, celui qui tient le manche a toujours raison !


"Curl" a écrit dans le message de
news:41514ecd$0$12983$
Bonjour..

Je commence à perdre les pédales.

Dim glong as Long
glong = 256 * 255

m'indique un dépassement de capacité .

Pourquoi ?



Avatar
Patrice Henrio
Toutes les réponses données sont belles et bonnes mais n'expliquent pas
pourquoi VB est incapable du transtypage dans ce cas.
Bien sûr on peut remarquer que cela provient du fait que le résultat n'est
pas du même type "naturel" que les opérandes, mais quand même !

"le_troll" a écrit dans le message de news:
%23xw14$
Bonjour, ça aussi ça, marche...

dim x as long
dim y as long
dim z as long
x = 256
y = 256
z = x * y

--
Merci, @+, bye, Joe
troll75 AROBASE iFrance POINT com
------------------------------------------
Le_Troll, éleveur de Trolls depuis César, qui disait:
Avec une hache, celui qui tient le manche a toujours raison !


"Curl" a écrit dans le message de
news:41514ecd$0$12983$
Bonjour..

Je commence à perdre les pédales.

Dim glong as Long
glong = 256 * 255

m'indique un dépassement de capacité .

Pourquoi ?







Avatar
Jean-Marc
"Patrice Henrio" a écrit dans le message de
news:%23$
Toutes les réponses données sont belles et bonnes mais n'expliquent pas
pourquoi VB est incapable du transtypage dans ce cas.
Bien sûr on peut remarquer que cela provient du fait que le résultat n'est
pas du même type "naturel" que les opérandes, mais quand même !



Hello,
c'est pourtant très simple.
Tout est clairement écrit dans la documentation.
Je cite MSDN:

* Operator
Used to multiply two numbers.
Syntax
result = number1*number2
The * operator syntax has these parts:
Part Description
result Required; any numeric variable.
number1 Required; any numeric expression.
number2 Required; any numeric expression.

Remarks
The data type of result is usually the same
as that of the most precise expression.

Ah, nous y voila:

"Le type du résultat est en général
le type de l'expression la plus précise."

Or quel est le type de '255' ou de '256' ?

Facile, demandons à VB: debug.print Typename(256)
La réponse est: Integer ; VB cherche donc à mettre le
résultat de la multiplication de 1 Integer par un
autre Integer dans un ... TADAA .. Integer, qui est le
type le plus précis.

Mais 256 *256 , ça ne tient pas dans un Integer,
d'ou un très normal et très bien documenté: Overflow.

Donc tout est clair :-)

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
Avatar
RABILLOUD JMARC [MVP]
En fait c'est du aux règles de contrainte de type qu'utilise VB.
Pour aller plus vite, VB dimensionne toujours au plus juste toute les
variables (à prendre dans le sens large) au type le plus petit possible.
Quand tu écris
glong = 255 *256
il travaille au niveau type sur
long = integer * integer

Hors la règle de contrainte indique que la variable de calcul intermédiaire
sera du type le plus grand des variables participant à l'opération. Dans ce
cas là integer puisque les deux variables sont du même type. C'est pour cela
que tu as une erreur.
Si tu écrit
glong%5& * 256
il lit long=long*integer, il travaille sur un long et il n'y a pas d'erreur.


"Patrice Henrio" a écrit dans le message de
news: %23$
Toutes les réponses données sont belles et bonnes mais n'expliquent pas
pourquoi VB est incapable du transtypage dans ce cas.
Bien sûr on peut remarquer que cela provient du fait que le résultat n'est
pas du même type "naturel" que les opérandes, mais quand même !

"le_troll" a écrit dans le message de news:
%23xw14$
Bonjour, ça aussi ça, marche...

dim x as long
dim y as long
dim z as long
x = 256
y = 256
z = x * y

--
Merci, @+, bye, Joe
troll75 AROBASE iFrance POINT com
------------------------------------------
Le_Troll, éleveur de Trolls depuis César, qui disait:
Avec une hache, celui qui tient le manche a toujours raison !


"Curl" a écrit dans le message de
news:41514ecd$0$12983$
Bonjour..

Je commence à perdre les pédales.

Dim glong as Long
glong = 256 * 255

m'indique un dépassement de capacité .

Pourquoi ?











Avatar
le_troll
Salut, lol, "nous y voila, nous y voila", tu forces le résultat à
être un long dim x as LONG, en gros t'es en train de lire et de dire que
quand tu déclares un long, VB en fait ce qu'il veut, ouais, ça ressemble à
du bug ça, comme les format(), les mask, etc... où le fonctionnement n'est
pas toujours très clair...

--
Merci, @+, bye, Joe
troll75 AROBASE iFrance POINT com
------------------------------------------
Le_Troll, éleveur de Trolls depuis César, qui disait:
Avec une hache, celui qui tient le manche a toujours raison !


"Jean-Marc" a écrit dans le message de
news:4151d1ff$0$24603$

"Patrice Henrio" a écrit dans le message de
news:%23$
> Toutes les réponses données sont belles et bonnes mais n'expliquent pas
> pourquoi VB est incapable du transtypage dans ce cas.
> Bien sûr on peut remarquer que cela provient du fait que le résultat


n'est
> pas du même type "naturel" que les opérandes, mais quand même !

Hello,
c'est pourtant très simple.
Tout est clairement écrit dans la documentation.
Je cite MSDN:

* Operator
Used to multiply two numbers.
Syntax
result = number1*number2
The * operator syntax has these parts:
Part Description
result Required; any numeric variable.
number1 Required; any numeric expression.
number2 Required; any numeric expression.

Remarks
The data type of result is usually the same
as that of the most precise expression.

Ah, nous y voila:

"Le type du résultat est en général
le type de l'expression la plus précise."

Or quel est le type de '255' ou de '256' ?

Facile, demandons à VB: debug.print Typename(256)
La réponse est: Integer ; VB cherche donc à mettre le
résultat de la multiplication de 1 Integer par un
autre Integer dans un ... TADAA .. Integer, qui est le
type le plus précis.

Mais 256 *256 , ça ne tient pas dans un Integer,
d'ou un très normal et très bien documenté: Overflow.

Donc tout est clair :-)

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."




Avatar
le_troll
Salut, ben ça sert à quoi alors de déclarer un LONG, si VB en fait
ce qu'il veut, c'est qui, qui commande ici, lol!

--
Merci, @+, bye, Joe
troll75 AROBASE iFrance POINT com
------------------------------------------
Le_Troll, éleveur de Trolls depuis César, qui disait:
Avec une hache, celui qui tient le manche a toujours raison !


"RABILLOUD JMARC [MVP]" a écrit
dans le message de news:
En fait c'est du aux règles de contrainte de type qu'utilise VB.
Pour aller plus vite, VB dimensionne toujours au plus juste toute les
variables (à prendre dans le sens large) au type le plus petit possible.
Quand tu écris
glong = 255 *256
il travaille au niveau type sur
long = integer * integer

Hors la règle de contrainte indique que la variable de calcul


intermédiaire
sera du type le plus grand des variables participant à l'opération. Dans


ce
cas là integer puisque les deux variables sont du même type. C'est pour


cela
que tu as une erreur.
Si tu écrit
glong%5& * 256
il lit long=long*integer, il travaille sur un long et il n'y a pas


d'erreur.


"Patrice Henrio" a écrit dans le message de
news: %23$
> Toutes les réponses données sont belles et bonnes mais n'expliquent pas
> pourquoi VB est incapable du transtypage dans ce cas.
> Bien sûr on peut remarquer que cela provient du fait que le résultat


n'est
> pas du même type "naturel" que les opérandes, mais quand même !
>
> "le_troll" a écrit dans le message de news:
> %23xw14$
>> Bonjour, ça aussi ça, marche...
>>
>> dim x as long
>> dim y as long
>> dim z as long
>> x = 256
>> y = 256
>> z = x * y
>>
>> --
>> Merci, @+, bye, Joe
>> troll75 AROBASE iFrance POINT com
>> ------------------------------------------
>> Le_Troll, éleveur de Trolls depuis César, qui disait:
>> Avec une hache, celui qui tient le manche a toujours raison !
>>
>>
>> "Curl" a écrit dans le message de
>> news:41514ecd$0$12983$
>>> Bonjour..
>>>
>>> Je commence à perdre les pédales.
>>>
>>> Dim glong as Long
>>> glong = 256 * 255
>>>
>>> m'indique un dépassement de capacité .
>>>
>>> Pourquoi ?
>>>
>>
>>
>
>




Avatar
Patrice Henrio
Je suis d'accord avec le troll. La déclaration du résultat en tant que long
devrait forcer Vb à faire tous ses calculs dans ce type.
Et j'estime que c'est un bug de la part des programmeurs qui ont conçu Vb de
n'avoir pas raisonner de la manière suivante

result=op1 * op2
Chaque variable est transtypée dans le type le plus précis des trois
variables (ou constantes).

Plusiurs anciens langages fonctionnaient comme cela à la satisfaction
générale.

J'admets cependant que grâce à jean-Marc et sa traduction je sias au moins
pourquoi Vb "plante" sur ce cas.

"le_troll" a écrit dans le message de news:

Salut, ben ça sert à quoi alors de déclarer un LONG, si VB en fait
ce qu'il veut, c'est qui, qui commande ici, lol!

--
Merci, @+, bye, Joe
troll75 AROBASE iFrance POINT com
------------------------------------------
Le_Troll, éleveur de Trolls depuis César, qui disait:
Avec une hache, celui qui tient le manche a toujours raison !


"RABILLOUD JMARC [MVP]" a écrit
dans le message de news:
En fait c'est du aux règles de contrainte de type qu'utilise VB.
Pour aller plus vite, VB dimensionne toujours au plus juste toute les
variables (à prendre dans le sens large) au type le plus petit possible.
Quand tu écris
glong = 255 *256
il travaille au niveau type sur
long = integer * integer

Hors la règle de contrainte indique que la variable de calcul


intermédiaire
sera du type le plus grand des variables participant à l'opération. Dans


ce
cas là integer puisque les deux variables sont du même type. C'est pour


cela
que tu as une erreur.
Si tu écrit
glong%5& * 256
il lit long=long*integer, il travaille sur un long et il n'y a pas


d'erreur.


"Patrice Henrio" a écrit dans le message de
news: %23$
> Toutes les réponses données sont belles et bonnes mais n'expliquent pas
> pourquoi VB est incapable du transtypage dans ce cas.
> Bien sûr on peut remarquer que cela provient du fait que le résultat


n'est
> pas du même type "naturel" que les opérandes, mais quand même !
>
> "le_troll" a écrit dans le message de news:
> %23xw14$
>> Bonjour, ça aussi ça, marche...
>>
>> dim x as long
>> dim y as long
>> dim z as long
>> x = 256
>> y = 256
>> z = x * y
>>
>> --
>> Merci, @+, bye, Joe
>> troll75 AROBASE iFrance POINT com
>> ------------------------------------------
>> Le_Troll, éleveur de Trolls depuis César, qui disait:
>> Avec une hache, celui qui tient le manche a toujours raison !
>>
>>
>> "Curl" a écrit dans le message de
>> news:41514ecd$0$12983$
>>> Bonjour..
>>>
>>> Je commence à perdre les pédales.
>>>
>>> Dim glong as Long
>>> glong = 256 * 255
>>>
>>> m'indique un dépassement de capacité .
>>>
>>> Pourquoi ?
>>>
>>
>>
>
>








1 2