2 votes

Grand entier implicitement tronqué en type non signé

J'essayais de déterminer la plus grande valeur possible dans un champ de bits, ce que j'ai fait est :

using namespace std;

struct A{
    unsigned int a:1;
    unsigned int b:3;
};

int main()
{
   A aa;
   aa.b = ~0U;
   return 0;
}

MSVC est correct mais GCC 4.9.2 m'a donné un avertissement :

warning: large integer implicitly truncated to unsigned type [-Woverflow]  

Je me demande comment je peux m'en débarrasser (en supposant que je ne connaisse pas la largeur de bit du champ, et que je veuille savoir quelle est la plus grande valeur possible dans ce champ).

0voto

AndreyT Points 139512

Vous pouvez essayer de contourner ce problème comme suit

aa.b = 1;
aa.b = -aa.b;

Il convient de noter que les aspects de la représentation de la valeur des champs de bits, y compris leur plage, ne sont actuellement pas spécifiés dans la norme du langage, ce qui est considéré comme un défaut de la norme C++. C'est étrange, surtout si l'on considère que d'autres parties du document (par exemple, la spécification des types enum) tentent de s'appuyer sur l'étendue des valeurs représentables des champs de bits pour leurs propres besoins. Ceci est censé être pris en charge à l'avenir .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X