Débutant C : petit programme

Utilisateur anonyme -  
Onde2Choc Messages postés 299 Statut Membre -
Salut,

je fais des exercices dans un livre pour apprendre le language C. La consigne est la suivante : "écrivez un programme affichant les codes numériques respectifs de Z et z"

Dans la réponse, il utilise une variable de type "char". Moi, dans mon programme ci-dessous, j'ai utilisé le type "int". Est-ce que c'est bon (en tt cas, ça marche... mais est-ce reglementaire, est ce moins bien ?). Pourquoi ont-ils déclarés une variable texte plus qu'une variable entière ?

Merci :-))
je reste sur le net pour la réponse...

françois

11 réponses

Jolkdarr
 
Hello !

char, short, int et long sont tous des types entiers.
En principe, on peut toujours considérer que :

sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)

Par conséquent, un char est convertible en short qui est convertible en int, etc... donc afficher un char en tant que int est parfaitement correct même si on utilise des octets inutiles.

Même si rien n'oblige un compilateur C à ranger un char dans un seul octet, c'est depuis la nuit des temps la convention qui a été retenue par les compilateurs. L'introduction d'un nouveau type a été nécessaire pour les caractères codés sur plus d'un octet (Unicode, UTF...) : wchar_t.
0
Utilisateur anonyme
 
ok, merci pour la réponse, c'est clair au moins...
A+

françois
0
Onde2Choc Messages postés 299 Statut Membre 4
 
Quand tu stockes un caractère en mémoire, il est transformé en binaire. Donc ce n'est plus Z ou z, c'est quelque chose comme 10010110. Pour savoir comment restituer le caractère à l'écran, ton caractère est donc représenté en mémoire par son code ASCII (90 pour Z si je me souviens bien). donc si tu fais char lettre = 'Z'
puis printf(" %d et la valeur numérique de %c", lettre, lettre);, ton programme va afficher "90 est la valeur numérique de Z" car lorsque tu mets %d dans printf, le programme attend un nombre entier, il prend donc le code ASCII (90) et lorsque tu mets %c, le programme attend un caractère, il prend donc le symbole du code ASCII stocké (Z).

MORALITE : 1)lorsque l'on stocke un caractère en mémoire, seul son code ASCII est stocké.
2)selon les informations que l'on donne au programme, il traitera le caractère ou son code ASCII.
3)le code ASCII est un nombre entier, donc on peut déclarer une variable int et l'utiliser comme un caractère en l'initialisant avec le code ASCII de ce caractère.
4)je n'ai aucun talent pédagogique, je ferais mieux de ne pas devenir prof.

J'espère que tu as compris mes explications embrouillées...

BOOM !
Laissez se propager l'onde de choc...
0
Utilisateur anonyme
 
En effet, j'ai pas très bien compris... enfin pas tout...
Tu me dit qu'une variable est stockée sous forme bianire, puis après tu me dis sous son code...
Tu peux me réexpliquer ?
Merci :-))
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Guki
 
A tout caractère est associé une valeur numérique qui est stocké sous forme binaire en mémoire.Par exemple l'espace à pour valeur ASCII le nombre décimal 32 mais en mémoire il n'y aura que le nombre binaire 00100000 qui vaut également 32.
0
Jolkdarr
 
Hello !

Ce qui doit être bien clair :
Une variable de type char est pour un compilateur C un entier signé (presque) toujours compris entre -128 et 127 et rien d'autre. C'est le programmeur qui l'interprète comme un caractère codé (ASCII, EBCDIC, IA5...) en fonction du clavier utilisé par exemple, comme une suite de booléens, comme une suite de pixels d'écran, comme un entier crypté, etc etc...

À noter que le codage des caractères sur 7/8 bits est en voie de disparition. À terme, l'utilisation de codages 16 bits (Unicode, OEM, ISO) vont très nettement se généraliser.

Take care !
0
Jolkdarr
 
Erratum :

À terme, l'utilisation de codages 16 bits (Unicode, OEM, ISO) va très nettement se généraliser.
0
Guki
 
C'est bizarre mais j'ai plutôt l'impression que ça commence à s'enliser l'Unicode surtout qu'il me semble les japonais ne veulent pas du 16 bits car il n'y a pas leurs glyphes locaux il faudrait adopter les 32 bits pour que tout le monde soit content (taille du code source * 4, le compilo va pas apprécier :-P). Aucun clavier à ce jour ne supporte l'Unicode > 8 bits. M'apprendra tu des choses à ce sujet?
0
Jolkdarr
 
Unicode supporte les deux jeux modernes des caractères Japonais. À savoir les Hiragana and katakana.

Pour consulter les glyphes :

http://www.unicode.org/charts/

Unicode a un gros avantage en étant choisi comme mapping standard des langages comme C++, Java, ... mais la concurrence est rude. C'est comme le système métrique, c'est bien pratique, mais cela n'empêche pas les anglo-saxons d'utiliser leur système propre. Les mappings de caractères existent par dizaines... Je pense qu'en passant à 48 bits, il y en aura sûrement des centaines ;)
0
Guki > Jolkdarr
 
Les Kanas sont les jeux de base appris en petites classes mais les Kanjis sont nombreux (1955 standardisés cf. kanji.free.fr) et trés usité couramment. Je ne pense pas les avoir vu dans les jeux proposés dans l'Unicode je m'en remets alors à tes yeux de lynx pour confirmer (ou le contraire?).
0
Jolkdarr > Jolkdarr
 
Ils n'y sont pas. Seuls ceux que je t'ai cité y figurent.

Des infos sur le codage des caractères Kanji sont fournies par :

http://kanji.free.fr/docs.php?doc=codage
0
Jolkdarr
 
Information complémentaire (utile pour les débutants) :
Pour connaître les détails d'implémentation des types entiers (char, short...), consulter le fichier standard <limit.h>.

Exemple (extrait) :

#define CHAR_BIT <#if expression >= 8>
#define CHAR_MAX <#if expression >= 127>
#define CHAR_MIN <#if expression <= 0>
#define SCHAR_MAX <#if expression >= 127>
#define SCHAR_MIN <#if expression <= -127>
#define UCHAR_MAX <#if expression >= 255>
#define MB_LEN_MAX <#if expression >= 1>

À noter : la contradition apparente entre le nombre de bits pour coder un char (8) et les limites utiles (0 < < 127). Intéressant. Non ?
0
Utilisateur anonyme
 
je n'ai pas un super niveau parce-que j'ai commencé ya pas longtemps, mais j'ai compris ce que t'as marqué... en effet c'est pas mal...

puisque je vois que tu réponds à mes messages, pourrait tu continuer à répondre au message 'prb serveur ?' dans le même forum, ainsi que 'modem : on peut téléphoner' dans le forum matériel.

Merci d'avance :-)
je reste en ligne

françois
0
Jolkdarr
 
Erratum :

Le fichier est limits.h et non limit.h, en C++ appelé au moyen de
#include <climits>

Take care !
0
Onde2Choc Messages postés 299 Statut Membre 4
 
Désolé de n'avoir pas été là hier pour expliquer ce que j'avais dit...
En gros, ton caractère est stocké en binaire. Or le binaire c'est des 1 et des 0, des chiffres quoi, pas des lettres. Donc il faut au préalable "convertir" ton caractère en nombres entiers. C'est comme multiplier A par 2, c'est impossible il faut d'abord convenir que A = 1 par exemple Et là, A * 2 = 1 * 2 = 2 = B (si B = 2). L'équivalent numérique de chaque caractère est appellé code ASCII, ou Unicode ou bien d'autres selon le code utilisé.

J'espère avoir été plus clair cette fois...

BOOM !
Laissez se propager l'onde de choc...
0