avertissement: la conversion de ‘int’ en ‘u8int’ peut en modifier la valeur, etc.

Ainsi, dernièrement, j’ai écrit des choses pour lesquelles je dois utiliser beaucoup de uint8 / uint16 et les mélanger entre eux et avec des littéraux entiers. Donc, je reçois des avertissements tels que:

warning: conversion to 'u16int' from 'int' may alter its value 

Code:

 u16int attr = attr_byte << 8; 

J’aime comstackr avec beaucoup d’avertissements. Je n’aime pas recevoir des avertissements. Existe-t-il un moyen (de préférence propre) de résoudre ce problème?

La norme C dit que les “promotions sur les entiers” sont effectuées sur chacun des opérandes et que le type du résultat est celui de l’opérande de gauche promu (C99 § 6.5.7 / 3).

Les promotions entières (§6.3.1.1 / 2) disent que si un int peut représenter toutes les valeurs possibles, il est promu à un int . Donc, en supposant que attr_byte soit un octet, il peut attr_byte un int , il est donc promu int . Ainsi, le résultat du décalage à gauche est un int (signé). Le compilateur a donc raison de se plaindre de ce que la conversion d’ int en u16int peut modifier sa valeur.

Dans ce cas, le résultat du décalage gauche ne sera jamais supérieur à 0xFF00 ni inférieur à 0, il n’y aura donc aucune perte de données. Mais si vous ne voulez pas que le compilateur vous prévienne ici, vous devez u16int le résultat en u16int , car le résultat du décalage sera toujours un int ou un unsigned int (ou un type entier plus grand), quel que soit le type de ses opérandes.

Vous pouvez toujours lancer:

 u16int attr = (u16int)(attr_byte << 8); 

C'est-à-dire que vous dites au compilateur que vous savez ce que vous faites.

 u16int attr = ((unsigned int) attr_byte << 8); 

Vous devez décaler au niveau des bits uniquement les types non signés.

C Standard ne nécessite aucun diagnostic pour la déclaration ci-dessus, mais si votre compilateur est trop détaillé, vous pouvez append un uint16_t supplémentaire à l'expression uint16_t au niveau du bit.