Faut-il toujours utiliser 'int' pour les nombres en C, même si elles sont non-négatives?

J'ai toujours utiliser unsigned int pour les valeurs qui ne doit jamais être négatif. Mais aujourd'hui, je
remarqué cette situation dans mon code:

void CreateRequestHeader( unsigned bitsAvailable, unsigned mandatoryDataSize, 
    unsigned optionalDataSize )
{
    If ( bitsAvailable  mandatoryDataSize >= optionalDataSize ) {
        //Optional data fits, so add it to the header.
    }

    //BUG! The above includes the optional part even if
    //mandatoryDataSize > bitsAvailable.
}

Devrais-je commencer à utiliser int au lieu de unsigned int pour les chiffres, même s'ils
ne peut pas être négatif?

  • Quel est le problème: si (bitsAvailable >= optionalDataSize + mandatoryDataSize) { ... } ?
  • Pour info, Java ne supporte pas les types non signés, donc si jamais vous prévoyez d'avoir votre code d'interopérabilité avec Java, vous devriez éviter ces types, à moins que vous vraiment besoin de la plage du type de valeurs spécifiques. Je ne crois qu'il est approprié d'utiliser unsigned uniquement pour les fins de l'indication que les valeurs négatives ne sont pas pris en charge/autorisés.
  • Un autre FYI: ce genre de bugs sont le genre que un bon analyseur de code statique trouverez pour vous. Coverity trouverez des problèmes comme celui-ci, n'avez pas utilisé d'autres assez pour le dire, mais je suis sûr que la plupart d'entre eux serait prise que. Voici une liste des outils disponibles: en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis
  • Voir aussi: stackoverflow.com/questions/1951519/when-to-use-stdsize-t pour le C++, mais les réponses restent pour la plupart s'appliquent
  • Il n'est pas parfait non plus. Plus peut provoquer un débordement, et l'envelopper non signé.
InformationsquelleAutor Steve Hanov | 2010-07-15