2016-10-30 2 views

Répondre

1

Les règles sont relativement simples. Le binaire + donnera le type de données du "plus grand" int. Si vous avez deux opérandes du même type, le résultat sera le même type.

L'expression

return x+y 

est évaluée en deux étapes. Dans le premier, le résultat de x + y est calculé. C'est un court (comme dans votre première déclaration). alors il est moulé au type de la fonction.

Si vous voulez éviter le trop-plein, vous devez jeter les opérandes de plus pour le type désiré:

return ((long)x) + y 

J'oveparenthesized pour plus de clarté.

+0

J'ai testé le premier code d'OP dans MSVC avec 'test_1 (32767, 32767);' et il a renvoyé le résultat correct '65534'. Bien que "short" ne doive être * au moins * 16 bits, il est * dans * mon compilateur. –

+0

@WeatherVane Quelle est l'ABI de MSVC? – Michas

+1

@Michas AFAIK les types entiers plus petits que 'int' sont promus' int' avant le calcul. S'il vous plaît [voir la réponse acceptée] (http://stackoverflow.com/questions/24371868/why-must-a-short-be-converted-to-an-int-before-arithmetic-operations-in-c-and-c) est le meilleur que je peux trouver à court terme. –