0
votes

Pourquoi un ajout d'un flotteur et d'int Resula-t-il un flotteur?

Je lis actuellement "le langage de programmation C - 2e édition". Dans le premier chapitre, il est expliqué qu'une opération d'un flotteur avec des résultats int. Int. Il y a ce programme: xxx

lorsque la ligne fahr = fahr + étape est exécutée, ne devrait pas fahr devenir int? Reste-t-il un flotteur parce que j'ai été déclaré comme un flotteur?


4 commentaires

Je pense que vous devez avoir mal interprété. Lorsque vous combinez le flotteur et INT, l'INT est converti en float, pas l'inverse.


Cette question peut être pertinent.


Les variables ne peuvent pas changer de type dans C.


OT: Concernant: Celsius = (5.0 / 9,0) * (Fahr-32.0); Les variables (Celsius, FAHR) ont le type float , mais les littéraux (5.0, 9,0 , 32.0) avoir type double un moyen bien meilleur est de déclarer les littéraux comme type float en ajoutant un F à la fin de chaque littéral, C'EST À DIRE celsius = (5.0f / 9.0f) * (Fahr-32.0f);


4 Réponses :


0
votes

Si le livre dit que, c'est faux. Simple que ça!

Lorsque vous ajoutez un entier à un flotteur, vous obtenez un flotteur. De plus, vous avez attribué le résultat à un float, il ne peut donc rien être autre chose. Les objets ne changent pas de type.


4 commentaires

Pouvons-nous parler de "objets" en C?


@Economix Oui, comme C ++. Voir la section 3.14 de la norme (référence C99).


@Economix Ce n'est pas le genre d'objet que vous envisagez, cependant.


@Economix: un objet en C est une région de stockage dont le contenu peut représenter des valeurs. Par exemple, pour int x , x est le nom de quatre octets de stockage pouvant contenir une valeur int (présumer la taille de la taille de INT est quatre). Ces quatre octets sont un objet.



2
votes

Oui, si vous avez déclaré votre variable comme un flotteur, cela ne changera pas dans votre code. Si vous effectuez une opération entre un int et un flotteur et mettez une variable de flotteur, vous aurez un résultat de flotteur, et l'inverse est vrai, si vous mettez votre variable dans un Var Int, vous perdrez la partie décimale de votre numéro. .

Vous ne pouvez pas changer votre type de variable en c.


1 commentaires

Cependant, dans le code actuel, le compilateur favorisera le int à float tout en effectuant le calcul réel



-3
votes

+1 pour lire ce livre. C choisit la plus haute résolution sur l'arithmique, de sorte que le flotteur gagne dans votre cas.


1 commentaires

32 bits float n'est pas une résolution supérieure supérieure à 32 bits int .



0
votes

Depuis que vous déclarez fahr code> en tant que float code>, une valeur que vous attribuez à celle-ci sera convertie en float code>.

Toute opération arithmétique entre un int code> et un float code> aura un (code> float code> résultat. Ceci est spécifié dans le cadre des conversions arithmétiques em>: p>

6.3.1.8 Conversions arithmétiques habituelles h3> 1 de nombreux opérateurs qui attendent des opérandes de type arithmétique provoquent des conversions et des résultats de rendement types d'une manière similaire. Le but est de déterminer un type réel commun pour les opérandes et résultat. Pour les opérandes spécifiés, chaque opérande est converti, sans changement de type domaine, à un type dont le type réel correspondant est le type réel commun. À moins que explicitement indiqué autrement, le type réel commun est également le type réel correspondant de le résultat, dont le domaine de type est le domaine de type des opérandes si elles sont identiques, et complexe sinon. Ce modèle s'appelle les conversions arithmétiques habituelles em>:

Premièrement, si le type réel correspondant d'un seul opérand est double double code>, l'autre L'opérande est converti, sans changement de type de type, à un type dont le type réel correspondant est Long Double code>.

Sinon, si le type réel correspondant d'un seul opérande est double code>, l'autre L'opérande est converti, sans changement de domaine de type, à un type dont Le type réel correspondant est double code>.

Sinon, si le type réel correspondant d'un seul opérande est float code>, l'autre L'opérande est converti, sans changement de domaine de type, à un type dont Le type réel correspondant est float code>. 62) sup>

Sinon, les promotions entière sont effectuées sur les deux opérandes. Puis le Les règles suivantes sont appliquées aux opérandes promus:

Si les deux opérandes ont le même type, aucune autre conversion n'est nécessaire.

Sinon, si les deux opérandes ont signé des types d'entiers ou les deux ont non signé types entiers, l'opérande avec le type de rang de conversion entier inférieur est converti au type de l'opérande avec plus de rang.

Sinon, si l'opérande qui a un type d'entier non signé a un rang plus grand ou égal au rang du type de l'autre opérande, puis l'opérande avec Le type d'entier signé est converti au type de l'opérande avec non signé Type d'entier.


Sinon, si le type de l'opérande avec type d'entiers signé peut représenter toutes les valeurs du type de l'opérande avec de type entier non signé, puis L'opérande avec un type d'entier non signé est converti au type de Opérande avec type d'entier signé.

Sinon, les deux opérandes sont converties au type d'entiers non signé correspondant au type de l'opérande avec type entier signé.
62) Par exemple, l'ajout d'un double _complex code> et a float code> implique juste la conversion de la Float Code> Opérande à Double CODE> (et produit un Double _Complex code> résultat). sup> blockQuote>

Cuil en ligne de 2011 em> sup> p>

une opération arithmétique entre deux int code> S donnera un résultat int code> résultat . Par exemple, 1/2 code> rendements 0 code>, 4/3 code> rendement 1 code>, 7/3 Produits 2 code>, etc. Si vous attribuez le résultat d'une division entière à une variable code> float code>, il sera stocké sous forme de float code> , mais vous n'obtenez pas la partie fractionnée du résultat. Iow, donné code comme p> xxx pré>

Votre sortie sera 1.0 code>, pas 1.33333 code>. Si vous souhaitez un résultat de point flottant, au moins un des opérandes doit être un type de point flottant: P>

float fahr = 4 / 3.0f;
printf( "%f\n", fahr );


0 commentaires