IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Taille des entiers


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Points : 65
    Points
    65
    Par défaut Taille des entiers
    Bonjour,
    Je suis entrain de chercher la taille minimale d'un nombre entier en mémoire.
    j'ai fait ces deux commandes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    printf(" taille unsigned long int = %d\n", sizeof( unsigned long int ));
    printf(" taille uint32_t = %d\n", sizeof( uint32_t ));
    le premier retourne 8 octets et le deuxième retourne 4 octets.
    normalement la borne max de ces types la même de 0 à 4294967295.n'est ce pas? parce que d'après une utilisation c'est la même borne.
    merci pour vos réponse

  2. #2
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Salut,

    le max que tu indiques est pour un entier non signé sur 32 bits, donc pour ton 64 bits ce devrait être 18 446 744 073 709 551 615.
    Par contre chez moi (MSVC/VS15) un "long int" fait 4 octets. En utilisant un "long long int" j'obtiens bien le max attendu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    signed long long int i = -1;
    printf("ulong int : %llu \n", i);
    // > ulong int : 18446744073709551615
    Plus je connais de langages, plus j'aime le C.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bien le bonjour;

    Je pense que le lien suivant te sera de bonne utilité : https://fr.wikibooks.org/wiki/Progra.../Types_de_base

    Concrètement, la norme définis la taille minimale que peut prendre un type de variable :
    • char : 8bits
    • short : 16bits
    • int : 16bits
    • long : 32bits


    En prenant les types de la plus petite taille à la plus grande taille, la norme indique qu'un type ne peut pas avoir un taille dépassant la taille de son type directement supérieur, mais peut l'égaler.
    Suivant le processeur sur lequel tu tournes, c'est généralement la taille du type "int" qui va changer, pour s'adapter au mot machine, c'est à dire la taille d'un élément "standard" pour le processeur sur lequel tu travailles. Actuellement, beaucoup de processeur grand public fonctionne avec une taille standard de 32bits, voir 64bits pour certains.

    Dans ton cas, pour connaitre les bornes de chaque type, tu peux utiliser les macros UINT32_MIN et UINT32_MAX disponible dans l'entête stdint.h, et voir également les macros ULONG_MIN et ULONG_MAX disponible dans le header limits.h.

    Attention également que l'existence du type de variable uintx (x = taille) n'est pas certifié, cela reste fonction du compilateur sur lequel tu tournes.

  4. #4
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Bonjour,

    La norme C99 définit les tailles minimum suivantes (paragraphe 5.2.4.2.1) :
    Their implementation-defined values shall be equal or greater in magnitude (absolute value) to those shown, with the same sign.
    — number of bits for smallest object that is not a bit-field (byte)
    CHAR_BIT 8
    — minimum value for an object of type signed char
    SCHAR_MIN -127 // −(2^7 − 1)
    — maximum value for an object of type signed char
    SCHAR_MAX +127 // 2^7 − 1
    — maximum value for an object of type unsigned char
    UCHAR_MAX 255 // 2^8 − 1
    — minimum value for an object of type char
    CHAR_MIN see below
    — maximum value for an object of type char
    CHAR_MAX see below
    — maximum number of bytes in a multibyte character, for any supported locale
    MB_LEN_MAX 1
    — minimum value for an object of type short int
    SHRT_MIN -32767 // −(2^15 − 1)
    — maximum value for an object of type short int
    SHRT_MAX +32767 // 2^15 − 1
    — maximum value for an object of type unsigned short int
    USHRT_MAX 65535 // 2^16 − 1
    — minimum value for an object of type int
    INT_MIN -32767 // −(2^15 − 1)
    — maximum value for an object of type int
    INT_MAX +32767 // 2^15 − 1
    — maximum value for an object of type unsigned int
    UINT_MAX 65535 // 2^16 − 1
    — minimum value for an object of type long int
    LONG_MIN -2147483647 // −(2^31 − 1)
    — maximum value for an object of type long int
    LONG_MAX +2147483647 // 2^31 − 1
    — maximum value for an object of type unsigned long int
    ULONG_MAX 4294967295 // 2^32 − 1
    — minimum value for an object of type long long int
    LLONG_MIN -9223372036854775807 // −(2^63 − 1)
    — maximum value for an object of type long long int
    LLONG_MAX +9223372036854775807 // 2^63 − 1
    — maximum value for an object of type unsigned long long int
    ULLONG_MAX 18446744073709551615 // 2^64 − 1
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  5. #5
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Celui là est un peu dur à avaler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    — maximum number of bytes in a multibyte character, for any supported locale
    MB_LEN_MAX 1
    Sinon, ce serait mieux de mettre correctement les exposants pour plus de lisibilité:

    SCHAR_MIN -127 // −(27 − 1)
    plutôt que

    SCHAR_MIN -127 // −(27 − 1)
    ɹǝsn *sıɹɐlos*

  6. #6
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Citation Envoyé par jlliagre Voir le message
    Celui là est un peu dur à avaler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    — maximum number of bytes in a multibyte character, for any supported locale
    MB_LEN_MAX 1
    [...]
    Bonjour,
    c'est une valeur minimum → il y a au minimum un byte par caractère, ce qui est le cas de l'ascii. Généralement cette valeur est bien plus grande (16 sous mon linux 64bits).

  7. #7
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Oui, je comprends bien où le standard veut en venir, mais je trouve un peu limite de parler de "multibytes characters" dans un système où cette valeur maximale vaut un, c'est à dire un système qui ne supporte pas de caractères stockés sur plus d'un octet.
    ɹǝsn *sıɹɐlos*

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Juin 2016
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Juin 2016
    Messages : 1
    Points : 0
    Points
    0
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    #include<stdio.h>
    #include<stdlib.h>
     
    int main(int argc, char * argv [])// argc nb chaines caract, argv pointeur chaine
    {
    	double laf, temp, st, ast;
    	char c;
    	char entree[255], sortie[255];
    	FILE *in, *out;
     
    	if(argc>1)
    		in = fopen(argv[1], "r");
    	if(argc==1 || in == NULL)
    		in = fopen("entree", "r");
     
    	if (in == NULL) {
    		fprintf(stderr, "Erreur in\n");
    		exit(1);
    	}
     
    	if(argc>2)
    		out = fopen(argv[2], "w");
    	if(argc<=2 || in == NULL)
    		out = fopen("sortie", "w");
     
    	if (out == NULL) {
    		fprintf(stderr, "Erreur out\n");
    		exit(1);
    	}
    	else
    	{
    		//fprintf(out, "| LAF\t| Temperature\t| Stokes \t\t| Antistokes\t| Stockes/Antistokes\t\n|\t\t|\t\t\t\t|\t\t\t\t|\t\t\t\t|\t\t\t\t\t\t|\n");
    		fprintf(out, "\"LAF\", \"Temperature\", \"Stokes\", \"Antistokes\", \"Stockes/Antistokes\";\n");
    		while ((c = fgetc(in)) != EOF)
    		{
     
    			if(fscanf(in, "<data id=\"1\">%lf,%lf,%lf,%lf</data>", &laf, &temp, &st, &ast) == 4)
    				//fprintf(out, "| %05.1lf\t| %010.6lf\t| %012.6lf\t| %012.6lf\t| %012.6lf\t|\n|\t\t|\t\t\t\t|\t\t\t\t|\t\t\t\t|\t\t\t\t\t\t|\n", laf, temp, st, ast, st/ast);
    				fprintf(out, "\"%05.1lf\", \"%010.6lf\", \"%012.6lf\", \"%012.6lf\", \"%05.6lf\";\n", laf, temp, st, ast, st/ast);
    		}
    	}
     
     
    	return 0;
    }

  9. #9
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 364
    Points : 5 378
    Points
    5 378
    Par défaut
    quel est le rapport avec le titre de la discussion ?

Discussions similaires

  1. taille des pointeurs et des entiers
    Par luckyvae dans le forum C++
    Réponses: 15
    Dernier message: 09/03/2010, 10h18
  2. Réponses: 9
    Dernier message: 17/01/2003, 11h45
  3. Taille des tabulations dans un TMemo ?
    Par dergen dans le forum Composants VCL
    Réponses: 2
    Dernier message: 07/01/2003, 19h38
  4. Taille des surfaces avec DirectDraw
    Par Shakram dans le forum DirectX
    Réponses: 5
    Dernier message: 09/09/2002, 00h42
  5. Taille des champs proportionnelle...
    Par Depteam1 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 09/08/2002, 11h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo