Je veux savoir que lorsque nous plaçons l'INT à doubler le résultat réel où INT est stocké est modifié ou augmenté? Parce que INT est de 4 octets (supposons) et lorsque nous devons passer à 8 octets (hypothèse), la taille a-t-elle également augmenté maintenant pour stocker la valeur du double? Et s'il vous plaît allez facilement sur moi s'il s'agit d'une question stupide? P>
5 Réponses :
Je veux savoir que lorsque nous plaçons l'INT à Doubler le résultat réel où INT est stocké est modifié ou augmenté? P>
Étant donné que INT et Double en C sont deux types distincts, oui, jetant un Int à un double ne peut pas arriver au même endroit où l'INT était - même si ces deux types avaient la même taille. P>
Pour illustrer: Si la coulée a écrasé la variable d'origine, quels seraient les effets de p>
xxx pré> être? P>
EDIT: @Dani a ajouté que P>
Le double peut occuper la même adresse si l'INT n'est plus utilisé. P> blockQuote>
Oui, les compilateurs peuvent vérifier si une variable sera / pourrait être accessible à un point ultérieur et peut effectuer des opérations en place si cela aide; Cependant ce n'est pas le cas ici: p>
- En général, vous devez supposer que l'adresse sera différente li>
- Dans ce cas, les types n'ont même pas la même taille li>
- dans mon exemple,
i code> est accessible ultérieurement et li>
- En réalité, ce n'est pas probablement une bonne idée - en fonction de ce qui est sur le point d'arriver au double après la coulée sur un processeur moderne, c'est qu'il sera probablement écrit dans un registre spécial dédié au traitement de points flottant, qui ne sera pas celui dans lequel le
int code> était. li> ol> blockQuote>
Pourquoi les bowvotes? J'ai la même réponse que Banach-Space; cette réponse me cite même!
Le double peut occuper la même adresse si l'INT n'est plus utilisé.
@Dani, c'est un cas particulier qui ne peut s'appliquer que si l'entier n'est vraiment plus utilisé (oui, les compilateurs sont intelligents et peuvent remarquer que) et même plus important ici, si les contraintes de taille permettent. Pour toutes les machines que je saurais, ce n'est pas le cas pour double code> et
int code>.
Casting n'affecte pas la variable et la mémoire correspondante. C'est juste et indication pour le compilateur Comment interpréter les bits le résident à l'emplacement donné.
à Marcus'es Exemple: p> maintenant, si Ceci est une modification (relativement) récente motivée par OPS Demande de clarification dans les commentaires. L'OP veut savoir: P> Qu'est-ce qui arrive à l'adresse de la mémoire de la somme lorsqu'il obtient le typast
Maintenant une valeur typée de la somme stockée ailleurs dans la mémoire p>
blockQuote> et voici le code: p> Il y a vraiment beaucoup de choses dans les trois lignes de code ci-dessus. Cependant, la chose importante ici est que la variable À ce stade, si vous voulez comprendre plus, vous avez le meilleur de la compilation d'assemblage et d'essayer de comprendre cela. J'espère que cela vous aide! P> p> d code> est une nouvelle variable dans un endroit totalement nouvel emplacement. La valeur d'origine,
i code> n'est pas affectée. Cependant, si vous commencez à jouer avec des pointeurs, vous devez faire attention: p>
double code> est de 8 octets largement alors notez que
P CODE> Compiler suppose que cela pointe sur un emplacement de mémoire contenant 8 octets de mémoire alloué à la variable qu'elle pointe de la variable. Ceci n'est cependant pas vrai, car en fait, il est indiqué à
i code>, qui n'est que 4 octets large (supposons que
int code> est de 4 octets large). P>
somme code> n'est pas du tout modifiée. Il n'est utilisé que comme argument en outre. Par souci d'ajout de deux variables, vous n'avez besoin que des valeurs correspondantes. Avant d'ajouter, le compilateur copiera probablement les deux variables en registres. Parce que vous coulez à un double, le compilateur stockera très probablement la valeur de
somme code> dans un registre 64 bits de large (supposons que le double est de 64 bits de large) et c'est tout. Cependant, gardez à l'esprit que c'est la mise en œuvre spécifique et variera d'un compilateur à l'autre. Ce n'est pas quelque chose qui est spécifié par la norme C. P>
Mais je ne comprends pas d'où cette mémoire supplémentaire vient qui est utilisée pour stocker le résultat de la typaste comme si nous allons que la typasty int comporte en double, cela peut prendre plus de bits que INT.
@Princevijaypratap dans beaucoup de cas pratiques, il est géré en interne par le compilateur. Il serait plus facile si vous signiez une ligne de code déroutant.
Il sera soit attribué sur la mémoire dynamique du temps d'exécution, soit préalablement alloué par le compilateur, s'il peut déduire que cela aura besoin de cette mémoire dans tous les cas.
@Princevijaypratap Notez que dans le premier exemple, j'ai défini une nouvelle variable, d code>. Cette variable se trouve dans un emplacement de mémoire complètement différent de
i code> et est probablement alloué sur la pile.
au lieu de d pouvons utiliser la même variable i? Ensuite, cela est-il alloué à un nouvel espace mémoire?
@Princevijaypratap qui qualifierait de ré-déclaration avec des types conflictuels, illégale. Dans n'importe quelle portée (c.-à-d. Entre les bretelles bouclées: {} code>) Une fois que vous déclarez
i code> comme
int code> il reste comme
int code >.
@PrincevijayPratap: être émoussé, j'aimerais vous demander pourquoi vous vous souciez de l'emplacement de votre variable de votre variable. Si vous voulez quelque chose d'écrit dans l'espace qui appartient à une variable d'un type différent, obtenez l'adresse de cette variable avec l'opérateur & CODE> préfixe, lancez le
double * code> à un
char * code> (strictement parlant, ce n'est pas valide c, mais fonctionne sur chaque Compilateur) et copie sur tout ce que vous voulez byte-ise.in général, vous laissez simplement le compilateur faire son travail et écrire et utiliser des variables comme variables i>. Si vous avez besoin d'un objet de mémoire pour être interprété comme deux types différents, utilisez
Union code>!
@ Banach-espace int somme = 17, compte = 5; double moyenne; moyenne = (double) somme / compte; S'il vous plaît dites-moi maintenant ce qu'il arrive à l'adresse de la mémoire de la somme lorsqu'il obtient TypeCast fait maintenant une valeur nominale de la somme stockée ailleurs dans la mémoire
@Princevijaypratap s'il vous plaît vérifier mon dernier édition. C'était trop long pour un commentaire. Et ce que vous avez posé de question n'est pas évident. J'espère que cela répond à votre question maintenant?
Lorsque nous plaçons le Non, la coulée de type n'est qu'un moyen de Convertissez une variable d'un type de données à un autre type de données. P> Lorsque nous faisons p> réellement, nous faisons le Les conversions de type peuvent être implicites, ce qui est effectué automatiquement par le compilateur, ou il peut être spécifié explicitement à travers l'utilisation de l'opérateur de distribution. P> habituel La conversion arithmétique est effectuée à l'aide de la hiérarchie suivante. P> int code> à
double code> Le résultat réel est-ce que INT est stocké est modifié ou augmenté?
la promotion arithmétique code>. Étant donné que
double code> de
8 octets code> et
int code> est de
4 octets code>. Par conséquent, il n'y aurait aucune perte. Mais vice-versa n'est pas vrai. P>
p> p>
c'est la même question que "dans Réponse simple: dans une variable temporaire enracinée par le compilateur. Cela sera probablement un registre. La norme de langue ne définit pas cela - pourquoi devrait-il réellement? P>
Le typecast est réellement similaire à Notez que la valeur d'origine n'est pas modifiée et que la variable de réception doit être du type approprié de toute façon (c'est-à-dire une raison pour laquelle vous ne pouvez pas typiser la variable de réception). P>
La conversion Int à doubler / flotteur est effectuée par le compilateur implicitement, il n'est donc pas nécessaire de ne pas nécessairement être utilisé - et il ne doit pas être utilisé dans de tels cas, car il masquer le problème résultant de modifications ultérieures des types. p> a = b + c * d; code> où est le résultat intermédiaire de
c * d code> stocké?". P>
-b code> (B annulé). Cela devra également être stocké quelque part avant d'être utilisé. P>
Le résultat de la distribution pourrait ne pas être stocké nulle part; En fait, il pourrait ne jamais être calculé du tout!
Si j'ai un fragment de programme p> le programme ne doit que se comporter comme si em> La conversion s'est produite, puis le résultat a été ajouté à E.g. Sur une machine avec une instruction "Ajouter entier d'une integer" d'un numéro de point flottant ", le compilateur peut choisir de vous donner un programme qui utilise cette instruction, plutôt que d'effectuer une conversion suivie d'une addition. P> P> 1.0 code>, mais tant que le résultat final est correct, le programme est autorisé à produire ce résultat de quelque manière que ce soit. Il n'a même pas besoin ressembler em> le code que vous avez écrit. p>