Règles de conversion des types de données en langage C (conversion implicite + conversion explicite)

Conversion de type pendant l'affectation

Si les types des deux côtés de l'opérateur d'affectation sont incohérents, mais qu'ils sont tous des types de base, une conversion de type est requise lors de l'affectation. La conversion de type est automatiquement effectuée par le système et les règles de conversion sont :

  1. Lors de l'affectation de données à virgule flottante (y compris simple et double précision) à une variable entière, arrondissez d'abord le nombre à virgule flottante, c'est-à-dire, ignorez la partie décimale, puis affectez-la à une variable entière.
  2. Lors de l'affectation de données entières à une variable simple ou double précision, la valeur reste inchangée, mais est stockée dans la variable sous la forme d'un nombre à virgule flottante.
  3. Lorsque vous affectez une donnée de type double à une variable flottante, convertissez d'abord le nombre à double précision en un nombre à simple précision, c'est-à-dire ne prenez que 6 à 7 chiffres significatifs et stockez-les dans les 4 octets de la variable de type flottant. Il convient de noter que la taille de la valeur double précision ne peut pas dépasser la plage de valeurs de la variable de type float.
  4. Lorsque des données de caractère sont affectées à une variable entière, la valeur du code ASCII du caractère est affectée à la variable entière.
  5. Affecter une donnée entière qui occupe plus d'octets à une variable entière ou une variable caractère qui occupe moins d'octets (par exemple, affecter une donnée int qui occupe 4 octets à une variable courte qui occupe 2 octets ou une variable qui occupe 1 octet char variable), uniquement l'octet de poids faible est envoyé à la variable affectée sans modification (c'est-à-dire qu'une troncation se produit).

——"Programmation en C (cinquième édition)" page 61


conversion de type implicite

  1. Lorsqu'ils apparaissent dans les expressions, les caractères et courts signés et non signés seront automatiquement convertis en int pour participer à l'opération. Lorsque short a la même taille que int, unsigned short sera converti en unsigned int.
  2. Dans toute opération impliquant deux types de données, les deux valeurs sont converties dans le type de niveau supérieur des deux types (appelé « promotion »), puis participent au calcul. Seules les données du même type peuvent être directement exploitées.
    1. L'ordre du niveau de type haut vers bas est le suivant : long double, double, flottant, non signé long long, long long, en utilisant un long, long, unsigned int, int.
    2. Lorsque long et int ont la même taille, alors unsigned int a un niveau supérieur à long. La raison pour laquelle char et short ne sont pas couverts est qu'ils ont déjà été promus en int ou int non signé.
    3. Exemple de démo
3 + 4 / 5.0f + 6 - 9.0(double)
根据运算符优先级,先计算 4 / 5.0f, 所以先把 4 转换成 float 4.0f 计算结果为 0.8f

3 + 0.8f + 6 - 9.0
然后根据由左向右的顺序:
先算 3 + 0.8f, 3 转换成 3.0f 计算结果为 3.8f
再计算3.8f + 6, 6 转换为 6.0f 计算结果为 9.8f

9.8f - 9.0
9.8f 转换为 double 9.8 计算结果为 18.8(double)
        
并不是一开始就全部转换成double        
  1. Dans une instruction d'affectation, le résultat final du calcul sera converti dans le type de la variable située à gauche de l'opérateur d'affectation. Ce processus peut être mis à niveau ou rétrogradé. La rétrogradation consiste à convertir une valeur en un type de niveau inférieur.
int a = 2022.22; // double转int,降级
double b = 22;   // int转double,升级
  1. Lorsqu'ils sont passés en tant que paramètre d'une fonction, char et short seront automatiquement convertis en int, float sera converti en double et le prototype de fonction peut être utilisé pour empêcher la promotion.
  2. Le boosting est généralement un processus fluide et sans perte, mais la réduction d'échelle peut provoquer une "troncature".

—— "C Primer Plus (cinquième édition)" page 105


conversion de type explicite (cast)

Forme : (type)donnée/expression

22 + 22.22      //隐式转换,结果是double型
22 + (int)11.11 //会先把11.11转换成11再和22相加,结果是int型

Guess you like

Origin blog.csdn.net/jiang1126/article/details/125297300