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 :

Problème en C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Inscrit en
    Octobre 2007
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 1
    Par défaut Problème en C
    qqun pourrai-til m'aider a répondre a cette question.

    Sur un machine 32 bits... il faut écrire une procédure qui fait la somme de deux nombres entiers signés sur 16 bits. Cette procédure doit permettre de détecter les cas de débordements positifs et négatifs. Cette procédure devra afficher le résultat de la somme et indiquer si le résultat correspondant est correct ou est un débordement positif ou négatif.

    Merci de votre aide

  2. #2
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par leffe Voir le message
    qqun pourrai-til m'aider a répondre a cette question.

    Sur un machine 32 bits... il faut écrire une procédure qui fait la somme de deux nombres entiers signés sur 16 bits. Cette procédure doit permettre de détecter les cas de débordements positifs et négatifs. Cette procédure devra afficher le résultat de la somme et indiquer si le résultat correspondant est correct ou est un débordement positif ou négatif.

    Merci de votre aide
    Le langage C ne spécifie pas qu'un certain type d'entier doit occuper 16 bits en mémoire. Tout ce que dit la norme, c'est:
    • un entier de type short doit pouvoir représenter une valeur entre -32767 et 32767
    • idem pour un entier de type int
    • un entier de type long doit pouvoir représenter une valeur entre -(2**31 - 1) et (2**31 - 1)

    De plus la relation suivante doit être vérifiée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sizeof(short) <= sizeof(int) <= sizeof(long)
    Sur certaines architectures, les types short, int et long font tous les trois 64 bits. De plus, le langage C n'impose aucune contrainte sur la manière de représenter les entiers négatifs (complément à deux, complément à 1, bit de signe)

    Pour détecter les débordements potentiels tu peux te servir des constantes symboliques SHRT_MIN, SHRT_MAX, INT_MIN, INT_MAX, etc. déclarées dans le fichier d'en-tête standard limits.h.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  3. #3
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par Thierry Chappuis Voir le message
    Le langage C ne spécifie pas qu'un certain type d'entier doit occuper 16 bits en mémoire.
    Thierry
    int16_t ou uint16_t en C99 et biensûr un processeur compatible.
    Cordialement.

  4. #4
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    int16_t ou uint16_t en C99 et biensûr un processeur compatible.
    Cordialement.
    Comme je n'utilise pas (ou peu, à part snprintf()) les extensions C99, j'ai tendance à les oublier...

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    int16_t ou uint16_t en C99 et biensûr un processeur compatible.
    Ce qui fait que ces types, bien que standards (C99), ne sont pas portables...

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par leffe Voir le message
    qqun pourrai-til m'aider a répondre a cette question.

    Sur un machine 32 bits... il faut écrire une procédure qui fait la somme de deux nombres entiers signés sur 16 bits. Cette procédure doit permettre de détecter les cas de débordements positifs et négatifs. Cette procédure devra afficher le résultat de la somme et indiquer si le résultat correspondant est correct ou est un débordement positif ou négatif.
    Il faut faire un additionneur binaire. L'utilisation d'un mot de 32-bit non signé (unsigned long, par exemple) permet de gérer proprement le débordement les calculs dur 16-bit.

    http://www.univ-lemans.fr/enseigneme.../addition.html

    http://emmanuel-delahaye.developpez.com/bits.htm

    Par contre, concernant les valeurs négatives, l'énoncé est incomplet. Il faut préciser comment sont codés les nombres négatifs. (signe+amplitude, complément à 1 ou complément à 2).

  7. #7
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par leffe Voir le message
    Sur un machine 32 bits...
    Apparamment il ne cherche pas spécialement la portabilité. Même si ces extensions de la norme C99 ne sont pas portables, elle restent néanmoins accessibles à une majorité de machine, voilà pourquoi j'ai jugé bon de les rappeler...

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Apparamment il ne cherche pas spécialement la portabilité. Même si ces extensions de la norme C99 ne sont pas portables, elle restent néanmoins accessibles à une majorité de machine, voilà pourquoi j'ai jugé bon de les rappeler...
    Justement, il y a des machines 32-bit qui n'ont pas de mots de 16-bit (DSP Freescale 56156, par exemple).

  9. #9
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Oui je connais le dsp freescale, c'est l'exemple qui est toujours sorti quand on explique au gens qu'un octet ne fait pas forcément 8 bits, maintenant il faudrait voir avec l'intéressé s'il code sur dsp freescale, et si ça n'est pas le cas, voir si son compilateur implémente cette partie de la norme C99. On ne va pas se priver des extensions apportés par la norme C99 sous prétexte que le dsp freescale à l'octet qui fait 16 bits. Même si je sais que pour vous la norme C99 n'apporte pas de grandes nouveautés, il reste que pour moi, beaucoup de ces nouveauté sont incontournables mais tu fais bien de rappeler Emmanuel qu'il faut attention à la portabilité dans ce cas la même si je l'avais déjà préciser dès le début.
    Cordialement.

  10. #10
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Oui je connais le dsp freescale, c'est l'exemple qui est toujours sorti quand on explique au gens qu'un octet ne fait pas forcément 8 bits, maintenant il faudrait voir avec l'intéressé s'il code sur dsp freescale, et si ça n'est pas le cas, voir si son compilateur implémente cette partie de la norme C99. On ne va pas se priver des extensions apportés par la norme C99 sous prétexte que le dsp freescale à l'octet qui fait 16 bits. Même si je sais que pour vous la norme C99 n'apporte pas de grandes nouveautés, il reste que pour moi, beaucoup de ces nouveauté sont incontournables mais tu fais bien de rappeler Emmanuel qu'il faut attention à la portabilité dans ce cas la même si je l'avais déjà préciser dès le début.
    Cordialement.
    A mon avis, un octet fait toujours 8 bits par définition. Par contre, la taille du byte varie avec l'architecture.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  11. #11
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par Thierry Chappuis Voir le message
    A mon avis, un octet fait toujours 8 bits par définition. Par contre, la taille du byte varie avec l'architecture.
    Thierry
    Non la traduction de byte en octet est un gros abus de langage qui ne date pas d'hier, c'est une erreur tout bonnement, et la norme du langage C est la pour le rappeler.
    Cordialement.

Discussions similaires

  1. Problème d'installation oracle 8.1.7 sous NT
    Par Anonymous dans le forum Installation
    Réponses: 7
    Dernier message: 02/08/2002, 14h18
  2. Problème d'impression
    Par IngBen dans le forum C++Builder
    Réponses: 7
    Dernier message: 22/05/2002, 11h37
  3. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10
  4. Réponses: 6
    Dernier message: 25/03/2002, 21h11

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