convertir int court en C
J'ai:
int a = 2147483647;
short b = (short)a;
et je reçois b = -1
alors que je m'attends int32
être converti en int16
(short
). Je m'attends à voir une certaine valeur et pas -1
.
Il vous plaît quelqu'un peut m'aider.
Je dirais, la valeur ne rentre pas, de sorte que les résultats ne sont pas définis.
Le résultat de la conversion est mise en œuvre définies par l', et non pas défini.
-1
est "de la valeur". Et le (short)
cast est inutile; la conversion sera effectuée implicitement: short b = a;
Le résultat de la conversion est mise en œuvre définies par l', et non pas défini.
OriginalL'auteur user1128265 | 2013-08-16
Vous devez vous connecter pour publier un commentaire.
Votre int A est plus grand que la taille de court. Lorsque vous convertissez Un court, vous obtenez un 1 à gauche de la plupart des bits, qui indiquent que c'est un nombre négatif. Puisque vous êtes l'obtention de -1, je suppose que vous êtes l'obtention de 1s dans l'ensemble des 16 bits, ce qui va vous donner -2^15 + 2^14 + 2^13... + 2^0, qui vous donnera -1. En bref (no pun intended), vous ne pouvez pas convertir l'entier à une courte si elle est trop grande.
OriginalL'auteur Magn3s1um
La valeur de 2 147 483 647, ou 231-1 déborde un entier 16 bits. Sa représentation binaire est égale à zéro dans le MSB suivi par 31 dans les bits restants.
Il ressemble à de la mise en œuvre les 16 derniers bits sont pris dans la conversion de
short
. Lorsque cela se produit, ils sont tous ensemble à1
, résultant en une Complément de 2 représentation de-1
:Toutefois, ni le 2-compliment représentation ni ce comportement est en général une partie de la norme C++, donc ce comportement est mise en œuvre définies.
n3690 page 80 4.7(1) dit qu'elle est définie par l'implémentation, pas indéfini. Vous ne savez pas si l'application est libre de la définir à un comportement indéterminé, cependant 🙂
OriginalL'auteur dasblinkenlight
La conversion d'une valeur d'un signé type, lorsque la valeur de la source ne rentre pas dans le type de cible, le rendement d'une de mise en œuvre définies par résultats. Ce qui signifie que toute compilateur conforme à la documentation doit documenter ce qui en résulte.
(C'est à la différence du comportement sur le dépassement d'un opérateur arithmétique. Par exemple:
a effectivement comportement indéfini. Mais dans les deux cas, vous devriez faire attention à l'écriture de votre code afin de ne pas déclencher ce genre de problème.)
Pour de nombreuses implémentations, pour la conversion et de l'arithmétique, un dépassement de capacité lorsque la cible est un N-bits type prend tout simplement le N bits du résultat correct.
Dans votre cas, apparemment
int
est 32 bits etshort
est de 16 bits (ces tailles peuvent varier selon les différentes implémentations).2147483647
est0x7fffffff
, la faible-de l'ordre de 16 bits sont0xffff
, qui est (encore une fois, sur votre mise en œuvre), la représentation de-1
typeshort
.Pour la conversion en unsigned types, le résultat est strictement défini par la norme; elle prend la faible-de l'ordre de N bits du résultat. Et pour déborder à virgule flottante conversion (par exemple, la conversion d'une très grande
double
de la valeur àfloat
), le comportement est indéfini.Jusqu'à présent, c'est tout de même pour le C et le C++. Mais juste pour ajouter à la confusion, à commencer par l'1999 la norme débordement d'un signé de conversion est autorisée à lever une mise en œuvre définies par le signal. C++ n'ont pas cette. Je ne sais pas du tout compilateur qui en fait cela.
-1
est "de la valeur". Était-il une valeur spécifique que vous attendiez?D'ailleurs:
Le cast est inutile. La cession, l'initialisation, passage de paramètres, et
return
déclarations pouvez affecter des valeurs entre les types numériques sans un plâtre. La valeur est convertie implicitement:OriginalL'auteur Keith Thompson
C'est
implementation defined
comportement, par exemplegcc
Entiers document de mise en Œuvre
dit:Cela peut différer d'un compilateur de compilateur, je ne suis pas en mesure de creuser des documents similaires pour
clang
nivisual studio
.De l'ébauche de la norme C++, section
4.7 Integral conversions
paragraphe3
:Si c'était
unsigned
ensuite, vous avez parfaitement comportement bien déterminé, conformément à l'alinéa2
:La langue est similaire dans les
C99
projet de norme section6.3.1.3 Signed and unsigned integers
.OriginalL'auteur Shafik Yaghmour
Vous pouvez faire ceci:
check-sum est
0x1234
.Ici est une autre façon:
de sortie est
1234
.OriginalL'auteur edW