comment trouver les limites de tous les types de données en c

Nous soaps tous que tous les types de données que nous avons utilisés dans c ont une limite fixe, comme

char range from -128 to 127 integer store value from -2147483648 to 2147483647 

Comme cela, tous ont des limites fixes.

Ma question est très simple: si nous utilisons un fichier d’en-tête, nous pouvons facilement déterminer la plage de tous les types de données. Mais existe-t-il un processus ou une logique permettant de trouver les limites de tous ces types de données sans utiliser de fonction ni de fichiers d’en-tête ni de macros prédéfinis?

S’il y en a s’il vous plaît résolu ma question

et je veux aussi savoir sur le fichier d’en-tête. Existe-t-il une méthode permettant de faire varier le nombre de chiffres après la décimale dans float?

Les fichiers d’en-tête existent pour une raison. Pour les types entiers signés, la plage admissible dépend de propriétés des types non observables. (Pour les types non signés, c’est simple, BTW, le minimum est toujours 0 et le maximum la valeur convertie est -1 ).

Un type signé dépend de

  • la largeur du type, c’est-à-dire sa taille en octets multipliée par le nombre de bits du type, CHAR_BIT
  • la présence éventuelle de bits de remplissage
  • la représentation de signe du type, car ils peuvent réaliser différentes valeurs minimales pour le type

Votre question est justifiée.

Considérons la deuxième affirmation la question:

 integer store value from -2147483648 to 2147483647 

Cela n’est vrai que sur un système 32 bits. Sur un système 16 bits, un entier peut stocker une valeur comprise entre -32768 et 32767.

Comme vous l’avez indiqué dans la question, la plupart des programmeurs s’appuient sur des fichiers d’en-tête tels que limit.h pour déterminer les plages de types de données.

Une façon de calculer les limites en nombre entier consiste à utiliser ‘sizeof ({type}) x 8’ ‘pour déterminer le nombre de bits disponibles. Ensuite, bien sûr, soustrayez un bit pour les types entiers ‘signés’ en tenant compte du bit de signe de complément à 2.

Bien qu’une telle méthode puisse fonctionner correctement, les entiers; il est marginal avec les types non-entiers, tels que float / double, etc.

Je suis assez nouveau en C mais j’ai remarqué que si vous décrémentez un type non signé, la valeur maximale lui sera atsortingbuée.

J’ai inclus limits.h simplement pour comparer les résultats.

 #include  #include  int main(void) { unsigned char c; unsigned short s; unsigned int i; unsigned long l; // char printf("UCHAR_MAX = %u\n", UCHAR_MAX); printf("UCHAR_MAX = %u\n", --c); // short printf("USHRT_MAX = %u\n", USHRT_MAX); printf("USHRT_MAX = %u\n", --s); // int printf("UINT_MAX = %u\n", UINT_MAX); printf("UINT_MAX = %u\n", --i); // long printf("ULONG_MAX = %lu\n", ULONG_MAX); printf("ULONG_MAX = %lu\n", --l); } 

Et les résultats:

 UCHAR_MAX = 255 UCHAR_MAX = 255 USHRT_MAX = 65535 USHRT_MAX = 65535 UINT_MAX = 4294967295 UINT_MAX = 4294967295 ULONG_MAX = 18446744073709551615 ULONG_MAX = 140731079060271 

Comme vous pouvez le constater, cela fonctionne pour tous sauf pour longtemps, quant à pourquoi .. eh bien peut-être que quelqu’un de plus expérimenté que moi peut expliquer.

La plage d’un type de données dépend du nombre de bits dont il dispose.

Par exemple, char est stocké sur 1 octet (= 8 bits), ce qui donne la plage (-2 ^ 7) – (2 ^ 7-1).

Donc, la formule pour les types de données signés est la suivante:

 2^(((sizeof(t)-1) * 8) to 2^((sizeof(t)-1) * 8) - 1. 

Pour les types de données non signés c’est:

 0 to 2^((sizeof(t)) * 8) - 1. 

Où t est le type de données. Il est multiplié par 8, car sizeof renvoie la taille en octets.

Cette formule ne s’applique pas aux types à virgule flottante car ils sont stockés différemment. Vous pouvez jeter un coup d’oeil à cette question ou à cette page wiki pour mieux comprendre. Je n’ai jamais eu besoin de travailler avec des nombres proches de la limite ET de le faire fonctionner sur plusieurs plates-formes. La limite était donc toujours une valeur constante pour moi.