J'ai un code qui ressemble à:Se débarrasser du décalage gcc par avertissement négatif
template<unsigned int A, unsigned int B>
int foo() {
int v = 1;
const int x = A - B;
if (x > 0) {
v = v << x;
}
bar(v);
}
gcc se plaindra de x étant négatif pour certaines instanciations de A, B; cependant, j'effectue une vérification pour m'assurer qu'il est non négatif. Quel est le meilleur moyen de contourner cela? Je sais que je peux lancer x
pour être unsigned int
mais cela entraînera des avertissements à propos de x
étant plus grand que la largeur de v
(puisqu'il émet un nombre négatif pour être positif). Je sais qu'il existe une solution de rechange qui consiste à créer une nouvelle fonction shift
, mais je voudrais éviter cela si possible.
Une très bonne solution. mais il faudrait modifier le problème (A - B> = 32). BTW, le si serait probablement exclu de toute façon puisque le compilateur peut détecter que cela n'arrivera jamais. –
@Evan Teran, Merci! J'ai remarqué le problème du passage à la ligne, mais le code original de l'OP l'a laissé emballer, donc j'ai supposé que c'était ce qu'il voulait. Je pense que vous avez raison sur l'optimisation du compilateur mais dans ma version, l'expression A - B n'est pas signée, évitant ainsi un avertissement. – jwfearn
Idéalement, je voudrais que le code me prévienne si je changeais trop si ce nombre était positif et ne me prévient pas du tout s'il était négatif (puisqu'il ne serait pas exécuté). Je suppose qu'il n'y a aucun moyen de contourner cela, mais de cette façon. Bon à savoir. –