Forum Clubic

[C++] Intervalles des variables type

bonjour je souhaiterais realiser par moi meme les valeurs maximales que peuvent prendre les variables selon leurs types.

Tout va tres bien avec les ‘signées’ mais des qu’elle ne le sont pas (unsigned…) alors là tout bug !
J’ai essayer pour Short avec un depassement mais cela n’est pas tres correct.

Si quelqu’un pouvait m’aider.


 /* b) les intervalles des types entiers */
/* marche */
  char DEPART_CHAR=1, MIN_CHAR;
  MIN_CHAR = DEPART_CHAR << (sizeof(char)*8-1);
  cout <<" L'intervalle de 'char' est compris entre " << int(MIN_CHAR) <<" et "<
< int(~MIN_CHAR) << endl;

  /* Marche pas mais doit trouver : 0  to 256 */
  unsigned char MAX_UNCHAR, MIN_UNCHAR=0, DEPART_UNCHAR=1;
  MAX_UNCHAR = DEPART_UNCHAR << 8; // << (sizeof(unsigned char)*8-1);
  cout <<" L'intervalle de 'unsigned char' est compris entre " << int(MIN_UNCHAR
) <<" et "<< int(MAX_UNCHAR) << endl;

/* marche */
  short DEPART_SHORT=1, MIN_SHORT;
  MIN_SHORT = DEPART_CHAR << (sizeof(short)*8-1);
  cout <<" L'intervalle de 'short' est compris entre " << int(MIN_SHORT) <<" et
"<< int(~MIN_SHORT) << endl;

/* marche mais pas tres propre */
  unsigned short MAX_UNSHORT, MIN_UNSHORT=0;
  MAX_UNSHORT = MIN_UNSHORT - 1;
  cout <<" L'intervalle de 'unsigned short' est compris entre " << int(MIN_UNSHO
RT) <<" et "<< int(MAX_UNSHORT) << endl;

  int DEPART_INT=1, MIN_INT;
  MIN_INT = DEPART_INT << (sizeof(int)*8-1);
  cout <<" L'intervalle de 'int' est compris entre " << int(MIN_INT) <<" et "<<
int(~MIN_INT) << endl;

Merci de votre aide
tifendro


/* b) les intervalles des types entiers */
/* marche */
 char DEPART_CHAR=1, MIN_CHAR;
 MIN_CHAR = DEPART_CHAR << (sizeof(char)*8-1);
 cout <<" L'intervalle de 'char' est compris entre " << int(MIN_CHAR) <<" et "<< int(~MIN_CHAR) << endl;

 /* Marche pas mais doit trouver : 0  to 256 */
 unsigned char MAX_UNCHAR, MIN_UNCHAR=0, DEPART_UNCHAR=1;
 MAX_UNCHAR = DEPART_UNCHAR << 8; // << (sizeof(unsigned char)*8-1);
 cout <<" L'intervalle de 'unsigned char' est compris entre " << int(MIN_UNCHAR) <<" et "<< int(~MAX_UNCHAR&0xFF) << endl;

/* marche */
 short DEPART_SHORT=1, MIN_SHORT;
 MIN_SHORT = DEPART_CHAR << (sizeof(short)*8-1);
 cout <<" L'intervalle de 'short' est compris entre " << int(MIN_SHORT) <<" et"<< int(~MIN_SHORT) << endl;

/* marche mais pas tres propre */
 unsigned short MAX_UNSHORT, MIN_UNSHORT=0;
 MAX_UNSHORT = MIN_UNSHORT << 8; 
 cout <<" L'intervalle de 'unsigned short' est compris entre " << int(MIN_UNSHORT) <<" et "<< int(~MAX_UNSHORT&0xFFFF) << endl;

 int DEPART_INT=1, MIN_INT;
 MIN_INT = DEPART_INT << (sizeof(int)*8-1);
 cout <<" L'intervalle de 'int' est compris entre " << int(MIN_INT) <<" et "<<int(~MIN_INT) << endl;

c’est en effet une solution mais je ne suis pas censé savoir la valeur que cela va faire.

je souhaiterais donc un code qui donnerait la valeur de lui meme !!!

cf les 2 exemples : Char et Short …

j’utilise le decalage à gauche du bit…donc j’ai la valeur sans la marquée directement.

Merci

Info utile : remplace 8 par CHAR_BIT.

Tu suppose que la machine fonctionne avec des octets (1 byte = 8 bits) ce qui n’est pas forcément vrai.

Pour le reste : pour les entiers non signés, tu as :

0U = min
~0U = max

C’est con. Mais c’est ça :slight_smile: doit juste manquer un cast pour supprimer la partie de gauche.

A part le CHAR_BIT que j’ai oublié (cf limites.h), le reste me parrait correct, je ne comprend pas le fait de dire que je “marque directement la valeur” ? :neutre:


unsigned char MAX_UNCHAR, MIN_UNCHAR=0;
cout <<" L'intervalle de 'unsigned char' est compris entre " << int(MIN_UNCHAR) <<" et "<< int(~MIN_UNCHAR) << endl;

ne marche pas.


unsigned short MAX_UNSHORT, MIN_UNSHORT=0;
MAX_UNSHORT = MIN_UNSHORT << (sizeof(short)*8-1);
cout <<" L'intervalle de 'unsigned short' est compris entre " << int(MIN_UNSHORT) <<" et "<< int(~MAX_UNSHORT&0xFFFF) << endl;

non plus

et


 int(~MAX_UNSHORT&0xFFFF)

c’est ca que j’appelle dire directement la valeur !

Merci de votre aide.

tif

up.

s’il vous plait g vraiment besoin d’aide.

merci
tif