Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
766 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Divers questions en C

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Divers questions en C

n°1980427
lassault1
Posté le 02-04-2010 à 15:49:48  profilanswer
 

Bonjour a tous  :)  
 
Voila j'ai quelque questions ou je n'ai pas trouvé de réponse..
 
 
1/ Peut on utiliser int pour mettre un caractère exemple A ?
 
2/ Pourquoi dans ce code on met i-- au lieu de i-1, c'est pas pareil ?
 

Code :
  1. int longueurChaine(const char* chaine)
  2. {
  3.     int i = 0;
  4.     char caractereActuel = 0;
  5.     do
  6.     {
  7.         caractereActuel = chaine[i];
  8.         i++;
  9.     }
  10.     while(caractereActuel != '\0');
  11.     i--;
  12.     return i;
  13. }


 
3/ Pourquoi dans la fonction strcat dans chaine1 il y a un espace entre le "t" de Salut et le "\0 ?
 
L'image se trouve a cette adresse: http://www.hiboox.fr/go/images/div [...] 9.png.html

mood
Publicité
Posté le 02-04-2010 à 15:49:48  profilanswer
 

n°1980431
rufo
Pas me confondre avec Lycos!
Posté le 02-04-2010 à 16:02:51  profilanswer
 

Franchement, t'aurais pus poser tes question dans l'autre topic que t'as ouvert :/ : http://forum.hardware.fr/hfr/Progr [...] 8355_1.htm
 
1) oui
2) i--; et i = i - 1; sont équivalents en terme de résultat sauf qu'il me semble que i-- est plus rapide mais ça se joue pas à grand chose et avec les compilos modernes doivent faire ce genre d'optimisation. Attention à pas confondre avec --i;
 
3) sans le code, je peux pas répondre.


Message édité par rufo le 02-04-2010 à 16:03:04

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°1980450
Turkleton
I don't quite understand you
Posté le 02-04-2010 à 16:24:25  profilanswer
 

1) un caractère, comme 'A', est en fait un code ASCII, représentable sous forme d'un entier (41 pour 'A'). Donc oui, tu peux utiliser un entier pour mettre un caractère.
Après, compare un sizeof(int) et un sizeof(char) et vois lequel doit être utilisé de préférence pour stocker un caractère ;)  
 
2) cf post de rufo
 
3) J'ai envie de te demander : pourquoi pas ? Le caractère espace est un caractère comme un autre. Imagine que tu veux afficher le nom de l'utilisateur, contenu dans une autre variable, après le "Salut ". Si tu ne fais pas figurer d'espace entre les deux, ça va être moche (et tu ne vas pas stocker un espace devant le nom de l'utilisateur). Ne te prends donc pas la tête avec des questions comme celles-ci, y'a déjà bien d'autres choses à penser :whistle:


---------------
If you think it could look good, then I guess it should
n°1980457
Elmoricq
Modérateur
Posté le 02-04-2010 à 16:31:07  profilanswer
 

Turkleton a écrit :

1) un caractère, comme 'A', est en fait un code ASCII, représentable sous forme d'un entier (41 pour 'A'). Donc oui, tu peux utiliser un entier pour mettre un caractère.
Après, compare un sizeof(int) et un sizeof(char) et vois lequel doit être utilisé de préférence pour stocker un caractère ;)

 

En C, le type naturel pour un caractère, c'est int (cf. fonctions standards comme strchr par exemple) :

$ cat foobar.c
#include <stdio.h>

 

int main(void) {
   printf("%d - %d - %d\n", sizeof(int), sizeof(char), sizeof('A'));
   return 0;
}

 

$ cc foobar.c
$ a.out
4 - 1 - 4

 

Attention, en C++, le type naturel d'un caractère, c'est bien char :

$ cat foobar.cc
#include <iostream>

 

int main(void) {
   std::cout << sizeof(int) << " - " << sizeof(char) << " - " << sizeof('A') << std::endl;
   return 0;
}

 

$ CC foobar.cc
$ a.out
4 - 1 - 1

Message cité 1 fois
Message édité par Elmoricq le 02-04-2010 à 16:31:37
n°1980472
lassault1
Posté le 02-04-2010 à 16:57:51  profilanswer
 

Pour la question 3 c'est ok car j'ai pas vu l'espace ici : chaine1[100] = "Salut "

n°1980490
Turkleton
I don't quite understand you
Posté le 02-04-2010 à 17:44:22  profilanswer
 

Elmoricq a écrit :


 
En C, le type naturel pour un caractère, c'est int (cf. fonctions standards comme strchr par exemple) :


Ok, donc dans un "char", c'est juste l'adresse de l'int correspondant qui est stockée ?


---------------
If you think it could look good, then I guess it should
n°1980505
lassault1
Posté le 02-04-2010 à 18:36:38  profilanswer
 

Merci pour les questions précédente.. c'est ok !! :)

 

J'ai une autre question :

 

Une case mémoire, sur un ordinateur correspond à un octet (8 bits), donc le nombre 145 sera stocké et traduit en binaire qui donnera 10010001 (dans une case), et si je veux stocké le nombre 37120 il faudra qu'il regroupe plusieurs cases d'un octet ?

Message cité 2 fois
Message édité par lassault1 le 02-04-2010 à 19:20:02
n°1980539
Elmoricq
Modérateur
Posté le 02-04-2010 à 20:46:07  profilanswer
 

Turkleton a écrit :


Ok, donc dans un "char", c'est juste l'adresse de l'int correspondant qui est stockée ?


 
Non, c'est la valeur du caractère, tout simplement. De toute façon j'ai jamais bien compris pourquoi en C les caractères étaient des int, alors que les "chaînes" de caractères étaient des char*. :o

n°1980541
mrbebert
Posté le 02-04-2010 à 20:51:00  profilanswer
 

lassault1 a écrit :

Merci pour les questions précédente.. c'est ok !! :)
 
J'ai une autre question :
 
Une case mémoire, sur un ordinateur correspond à un octet (8 bits), donc le nombre 145 sera stocké et traduit en binaire qui donnera 10010001 (dans une case), et si je veux stocké le nombre 37120 il faudra qu'il regroupe plusieurs cases d'un octet ?

Quand tu définis une variable pour stocker des entiers, tu as différents types disponibles, qui diffèrent justement sur le nombre d'octets utilisés. Si tu veux stocker ton "37120" dans un entier sur 1 octet, effectivement, ca va pas aller (à priori, y aura que les 8 derniers bits, donc 0 ici). Si tu le mets dans un entier sur 2, 4 ou 8 octets, ca ira :)  
A toi donc de bien choisir les types de données utilisés.

n°1980542
gilou
Modérateur
Modzilla
Posté le 02-04-2010 à 20:51:47  profilanswer
 

Turkleton a écrit :


Ok, donc dans un "char", c'est juste l'adresse de l'int correspondant qui est stockée ?

Non, dans un char, c'est la valeur de l'int qui est stockée.
A+,
Edit: grilled parce que je suis parti bouffer sans faire un post de ma réponse :/


Message édité par gilou le 02-04-2010 à 20:52:31

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
mood
Publicité
Posté le 02-04-2010 à 20:51:47  profilanswer
 

n°1980544
Elmoricq
Modérateur
Posté le 02-04-2010 à 20:55:17  profilanswer
 

lassault1 a écrit :


Une case mémoire, sur un ordinateur correspond à un octet (8 bits),

 

Oui et non. En vrai, la "plus petite entité adressable" (c'est la définition), c'est un "byte".
Il se trouve qu'à l'heure actuelle, 99.99% (100% ?) du parc informatique à un byte valant 8 bits, donc un octet.
Mais ce n'est pas pour autant qu'un byte == un octet. Il y a eu des machines avec des bytes différents de 8 bits, par exemple le PDP-1, où 1 byte valait 18 bits. À l'avenir, rien ne garanti que nous n'aurons pas des machines avec 1 byte = 16, 32, 64 ou whatever bits.

 
lassault1 a écrit :

donc le nombre 145 sera stocké et traduit en binaire qui donnera 10010001 (dans une case), et si je veux stocké le nombre 37120 il faudra qu'il regroupe plusieurs cases d'un octet ?


La remarque est pertinente, mais il est plus simple de raisonner en plage de nombres.
En C, la norme ISO défini des plages de nombre minimum, c'est-à-dire que selon les machines, ces plages peuvent être plus grandes, mais jamais plus petites.
Selon la norme (pour les types signés) :
char = -128 -> +127
int = -32 768 -> +32 767
long int -2 147 483 648 -> +2 147 483 647
etc.

Message cité 1 fois
Message édité par Elmoricq le 02-04-2010 à 20:56:18
n°1980545
gilou
Modérateur
Modzilla
Posté le 02-04-2010 à 20:56:19  profilanswer
 

Citation :

alors que les "chaînes" de caractères étaient des char*

A mon avis, juste pour reconnaitre, quand tu vois char*, que tu as une chaine, et que quand tu vois int*, tu as des données utilisées autrement. Bref, en C, pour la lisibilité et la maintenance des programmes. Bon, il y a aussi une question de taille de données.  
A+,


Message édité par gilou le 02-04-2010 à 21:00:46

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1980550
Turkleton
I don't quite understand you
Posté le 02-04-2010 à 21:01:41  profilanswer
 

Elmoricq a écrit :


 
Non, c'est la valeur du caractère, tout simplement. De toute façon j'ai jamais bien compris pourquoi en C les caractères étaient des int, alors que les "chaînes" de caractères étaient des char*. :o


 :jap: (et à Gilou aussi ;) )
 
C'est le coup du sizeof('A') = 4 bits qui m'a fait me poser la question


---------------
If you think it could look good, then I guess it should
n°1980551
gilou
Modérateur
Modzilla
Posté le 02-04-2010 à 21:06:31  profilanswer
 

Elmoricq a écrit :

 

Oui et non. En vrai, la "plus petite entité adressable" (c'est la définition), c'est un "byte".
Il se trouve qu'à l'heure actuelle, 99.99% (100% ?) du parc informatique à un byte valant 8 bits, donc un octet.
Mais ce n'est pas pour autant qu'un byte == un octet. Il y a eu des machines avec des bytes différents de 8 bits, par exemple le PDP-1, où 1 byte valait 18 bits. À l'avenir, rien ne garanti que nous n'aurons pas des machines avec 1 byte = 16, 32, 64 ou whatever bits.

 


Tu confonds la notion de mot machine [word] (ie la zone entre ce que pointent les adresses @ et @+1) et la notion d'octet [byte] qui fait toujours 8 bits.
En C, le type int a pour taille un word, et le type char a pour taille un byte.
voir plus bas.

 

A+,

Message cité 1 fois
Message édité par gilou le 02-04-2010 à 21:29:16

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1980554
Elmoricq
Modérateur
Posté le 02-04-2010 à 21:18:57  profilanswer
 

gilou a écrit :

Tu confonds la notion de mot machine [word] (ie la zone entre ce que pointent les adresses @ et @+1) et la notion d'octet [byte] qui fait toujours 8 bits.
En C, le type int a pour taille un word, et le type char a pour taille un byte.

 

A+,

 

Hmm, non. Byte n'est pas le mot anglais pour "octet". Si aujourd'hui toutes nos machines (à ma connaissance, j'ai aucune idée du nombre d'architectures embarquées qui existent :o) ont un byte de 8 bits, ça n'a pas toujours été le cas, et ça ne sera peut-être pas le cas dans le futur.

 

Par contre je te rejoins sur ta dernière phrase : sizeof(char) vaut toujours 1 en C d'après la norme, soit 1 byte. Et ce quelle que soit l'architecture.


Message édité par Elmoricq le 02-04-2010 à 21:19:39
n°1980559
gilou
Modérateur
Modzilla
Posté le 02-04-2010 à 21:25:06  profilanswer
 

Oui, j'ai dit une connerie, car de plus j'ai bossé sur des bécanes ou le byte avait 7 ou bien 12 bits il me semble bien :o
Un byte est l'unité de stockage mémoire, la zone entre ce que pointent les adresses @ et @+1. Un char a par définition pour taille 1 byte.
Historiquement (K&R) un int avait pour taille la taille d'une adresse mémoire (non basée), et quand j'ai commencé le C, il n'était pas rare de voir du code ou un int servait à ranger une adresse. Bref, un int avait la taille d'un pointeur. Ensuite, en particulier avec les adressages biscornus de l'architecture segmentée x86 ça n'a plus été exactement ça.
Bref, la norme actuelle dit simplement que la taille d'un int est ce qui convient le mieux a l'architecture de la bécane :)
Elle demande que char <= short <= int <= long soit respecté et impose des range (ou taille?) minimum aux types char et int.
Bon, je constate néanmoins que sur mon compilo C, j'ai toujours sizeof(int*) = sizeof(int) néanmoins
A+,

Message cité 2 fois
Message édité par gilou le 02-04-2010 à 22:10:00

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1980566
Un Program​meur
Posté le 02-04-2010 à 22:09:36  profilanswer
 

Elmoricq a écrit :

De toute façon j'ai jamais bien compris pourquoi en C les caractères étaient des int, alors que les "chaînes" de caractères étaient des char*.


 
L'histoire.  Le BCPL était un langage non typé.  Le seul élément manipulé était le mot.  Normal à une époque (1966) où les ordinateurs se classaient en commerciaux (adressable par caractère et ne manipulant les nombres qu'en BCD) ou scientifique (adressable par mot de 36 bits ou plus et mauvais en manipulation de caractères) en plus des mini qui commencaient. Les caractères isolés étaient donc des mots, les chaines désignaient l'adresse d'un tableau de mots dans lequel étaient compactés les caractères (à raison de 6 caractères de 6 bits par mot de 36 bits par exemple).  L'espace mémoire était plus réduit (18 bits d'adresse par exemple pour des machines avec mot de 36 bits, ça fait 256K mots) et on ne perdrait pas de la place à mettre un caractère par mot.
 
[quotemsg=1980544,11,14993]Oui et non. En vrai, la "plus petite entité adressable" (c'est la définition), c'est un "byte".[/quote]
 
Oui et non.  C'est un des trois sens de byte.  L'original, c'est la taille nécessaire à stocker un caractère.  Le troisième, c'est 8 bits.  L'extension de sens c'est faite parce que les trois vont de plus en plus ensemble.
 
Le C et le C++ confondent effectivement les deux premiers.  Mais un byte peut y faire plus de 8 bits, pas moins.  Ces langages sont quand même conçu pour permettre une implémentation où on a un byte plu
 

Citation :

Il se trouve qu'à l'heure actuelle, 99.99% (100% ?) du parc informatique à un byte valant 8 bits, donc un octet.
Mais ce n'est pas pour autant qu'un byte == un octet. Il y a eu des machines avec des bytes différents de 8 bits, par exemple le PDP-1, où 1 byte valait 18 bits. À l'avenir, rien ne garanti que nous n'aurons pas des machines avec 1 byte = 16, 32, 64 ou whatever bits.


 
Sur les machines adressables par mot, on a utilise rarement le sens "plus petite unité adressable" pour byte.  Dans leur contexte, byte est toujours la place prise par un caractère (et on peut se retrouver avec un byte de 7 bits et des mots de 36 bits, en laissant un bit inutilisé quand on compacte les caractères).  Sans parler de celles qui comme Stretch étaient adressable par bit bien qu'adressable par mot.
 
En passant, on utilise toujours des machines adressables par mot.  Outre chez les nostalgiques et les englués, les DSP le sont souvent. Pour revenir au C et au C++, je m'attendrais à ce qu'une implémentation "historique" sur une machine adressable par mot fasse usage des lattitudes laissée pour avoir void* et char* (composé d'une adresse de mot et d'une indication d'un caractère dans le mot) plus grand que les autres pointeurs (avec short* éventuellement).  Une implémentation sur DSP aura plus facilement le byte égal au mot.
 
Allez, j'arrête de radoter sur une époque dont je n'ai connu que le crépuscule (j'ai de justesse utilisé un PDP-10, alors que sa fabrication n'était pas encore abandonnée par DEC).


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°1980567
gilou
Modérateur
Modzilla
Posté le 02-04-2010 à 22:14:38  profilanswer
 

Turkleton a écrit :


 :jap: (et à Gilou aussi ;) )
 
C'est le coup du sizeof('A') = 4 bits qui m'a fait me poser la question


Tu aurais fait  
printf("%d - %d - %d\n", sizeof(1), sizeof('A'), sizeof((char)'A'));
-> 4 - 4 - 1 chez moi
ca aurait été plus explicite.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1980568
Un Program​meur
Posté le 02-04-2010 à 22:20:01  profilanswer
 

Évidemment, la discussion a continué pendant que je radotais.
 

gilou a écrit :


Historiquement (K&R) un int avait pour taille la taille d'une adresse mémoire (non basée),


 
Pas nécessairement (pas mal d'archi adressable par mot n'ont pas un espace d'adressage égal au mot, elles ont même parfois des registres d'adresse plus petit -- voir les Cray par exemple).
 

Citation :

Bon, je constate néanmoins que sur mon compilo C, j'ai toujours sizeof(int*) = sizeof(int) néanmoins


 
Moi pas (le premier fait 64 bits, le deuxième 32; c'est le cas pour Unix 64 bits depuis 15 ans)

Message cité 1 fois
Message édité par Un Programmeur le 02-04-2010 à 22:21:05

---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°1980569
lassault1
Posté le 02-04-2010 à 22:22:22  profilanswer
 

oula je mélange tout...
 
Qui peut m'expliqué comment les variables de type char, int long, float, et double sont stocké dans la mémoire en binaire ?

n°1980571
Un Program​meur
Posté le 02-04-2010 à 22:31:23  profilanswer
 

lassault1 a écrit :

oula je mélange tout...


 
N'essaye pas trop de nous suivre quand on radote...
 

Citation :

Qui peut m'expliquer comment les variables de type char, int long, float, et double sont stockées dans la mémoire en binaire ?


 
En laissant tomber les organisations historiques et exotiques.
 
La mémoire c'est des cases numérotées permettant de contenir un nombre de 0 à 255 (ou 8 bits).
 
Une variable de type char prend une case.
int, 4 cases consécutives
long 4 ou 8 cases (32/64 bits au moins pour Unix, Windows a les long sur 32 bits même en 64 bits)
float 4 cases
double 8
 


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°1980573
gilou
Modérateur
Modzilla
Posté le 02-04-2010 à 22:34:21  profilanswer
 

Un Programmeur a écrit :

 

Pas nécessairement (pas mal d'archi adressable par mot n'ont pas un espace d'adressage égal au mot, elles ont même parfois des registres d'adresse plus petit -- voir les Cray par exemple).
 

Citation :

Bon, je constate néanmoins que sur mon compilo C, j'ai toujours sizeof(int*) = sizeof(int) néanmoins

 

Moi pas (le premier fait 64 bits, le deuxième 32; c'est le cas pour Unix 64 bits depuis 15 ans)

J'ai jamais eu l'occasion de programmer sur Cray (par contre sur PDP, sous multics  [:panzemeyer] )
Sinon, c'est pour ça que j'avais précisé mon compilo, sachant bien que ce n'était pas le cas de tous
A+,

Message cité 1 fois
Message édité par gilou le 02-04-2010 à 22:34:36

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1980576
Un Program​meur
Posté le 02-04-2010 à 22:39:51  profilanswer
 

gilou a écrit :

J'ai jamais eu l'occasion de programmer sur Cray (par contre sur PDP, sous multics  [:panzemeyer] )


 
Petit cadeau: http://web.mit.edu/multics-history [...] urces.html (il manque une section PL/I).

Message cité 1 fois
Message édité par Un Programmeur le 02-04-2010 à 22:41:43

---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°1980577
gilou
Modérateur
Modzilla
Posté le 02-04-2010 à 22:45:58  profilanswer
 

:jap:  
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1980578
Elmoricq
Modérateur
Posté le 02-04-2010 à 22:50:37  profilanswer
 


 


 
J'ai appris plein de trucs ce soir, merci. [:romf]

n°1980583
gilou
Modérateur
Modzilla
Posté le 02-04-2010 à 23:11:52  profilanswer
 

Elmoricq a écrit :


 
J'ai appris plein de trucs ce soir, merci. [:romf]

Notes que si on veut rester dans le cadre du C++, j'aime bien ce qui est dit ici, en particulier au 26.6, sur comment des compilos C++ différents pourraient avoir des bytes de taille différentes sur une même machine:
______________________________________________________________________________________________________________________________________________________
[26.1] Can sizeof(char) be 2 on some machines? For example, what about double-byte characters?
 
No, sizeof(char) is always 1. Always. It is never 2. Never, never, never.
Even if you think of a "character" as a multi-byte thingy, char is not. sizeof(char) is always exactly 1. No exceptions, ever.
 
[26.2] What are the units of sizeof?
 
Bytes.
For example, if sizeof(Fred) is 8, the distance between two Fred objects in an array of Freds will be exactly 8 bytes.
As another example, this means sizeof(char) is one byte. That's right: one byte. One, one, one, exactly one byte, always one byte. Never two bytes. No exceptions.
 
[26.3] Whoa, but what about machines or compilers that support multibyte characters. Are you saying that a "character" and a char might be different?!?
 
Yes that's right: the thing commonly referred to as a "character" might be different from the thing C++ calls a char.
I'm really sorry if that hurts, but believe me, it's better to get all the pain over with at once. Take a deep breath and repeat after me: "character and char might be different." There, doesn't that feel better? No? Well keep reading — it gets worse.
 
[26.4] But, but, but what about machines where a char has more than 8 bits? Surely you're not saying a C++ byte might have more than 8 bits, are you?!?
 
Yep, that's right: a C++ byte might have more than 8 bits.
The C++ language guarantees a byte must always have at least 8 bits. But there are implementations of C++ that have more than 8 bits per byte.
 
[26.5] Okay, I could imagine a machine with 9-bit bytes. But surely not 16-bit bytes or 32-bit bytes, right?
 
Wrong.
I have heard of one implementation of C++ that has 64-bit "bytes." You read that right: a byte on that implementation has 64 bits. 64 bits per byte. 64. As in 8 times 8.
And yes, you're right, combining with the above would mean that a char on that implementation would have 64 bits.
 
[26.6] I'm sooooo confused. Would you please go over the rules about bytes, chars, and characters one more time?
 
Here are the rules:
 
    * The C++ language gives the programmer the impression that memory is laid out as a sequence of something C++ calls "bytes."
    * Each of these things that the C++ language calls a byte has at least 8 bits, but might have more than 8 bits.
    * The C++ language guarantees that a char* (char pointers) can address individual bytes.
    * The C++ language guarantees there are no bits between two bytes. This means every bit in memory is part of a byte. If you grind your way through memory via a char*, you will be able to see every bit.
    * The C++ language guarantees there are no bits that are part of two distinct bytes. This means a change to one byte will never cause a change to a different byte.
    * The C++ language gives you a way to find out how many bits are in a byte in your particular implementation: include the header <climits>, then the actual number of bits per byte will be given by the CHAR_BIT macro.

Let's work an example to illustrate these rules. The PDP-10 has 36-bit words with no hardware facility to address anything within one of those words. That means a pointer can point only at things on a 36-bit boundary: it is not possible for a pointer to point 8 bits to the right of where some other pointer points.
 
One way to abide by all the above rules is for a PDP-10 C++ compiler to define a "byte" as 36 bits. Another valid approach would be to define a "byte" as 9 bits, and simulate a char* by two words of memory: the first could point to the 36-bit word, the second could be a bit-offset within that word. In that case, the C++ compiler would need to add extra instructions when compiling code using char* pointers. For example, the code generated for *p = 'x' might read the word into a register, then use bit-masks and bit-shifts to change the appropriate 9-bit byte within that word. An int* could still be implemented as a single hardware pointer, since C++ allows sizeof(char*) != sizeof(int*).
 
Using the same logic, it would also be possible to define a PDP-10 C++ "byte" as 12-bits or 18-bits. However the above technique wouldn't allow us to define a PDP-10 C++ "byte" as 8-bits, since 8*4 is 32, meaning every 4th byte we would skip 4 bits. A more complicated approach could be used for those 4 bits, e.g., by packing nine bytes (of 8-bits each) into two adjacent 36-bit words. The important point here is that memcpy() has to be able to see every bit of memory: there can't be any bits between two adjacent bytes.
 
Note: one of the popular non-C/C++ approaches on the PDP-10 was to pack 5 bytes (of 7-bits each) into each 36-bit word. However this won't work in C or C++ since 5*7 = 35, meaning using char*s to walk through memory would "skip" a bit every fifth byte (and also because C++ requires bytes to have at least 8 bits).
 
______________________________________________________________________________________________________________________________________________________
( http://www.parashift.com/c++-faq-l [...] l#faq-26.4 )
 
A+,


Message édité par gilou le 02-04-2010 à 23:17:15

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1980630
lassault1
Posté le 03-04-2010 à 11:54:46  profilanswer
 

mais moi je veux juste savoir si le type short (2 octets) occupe 1 ou 2 case en mémoire !

n°1980640
gilou
Modérateur
Modzilla
Posté le 03-04-2010 à 13:06:39  profilanswer
 

lassault1 a écrit :

mais moi je veux juste savoir si le type short (2 octets) occupe 1 ou 2 case en mémoire !

Si tu dis que ça fait deux octets, c'est que ca occupe deux cases mémoires, hein.
 
Globalement, ca dépend des plateformes et compilateurs. La seule chose dont tu puisse être sur c'est que:
 sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
 sizeof(short) >= 2
 sizeof(int) >= 2
 sizeof(long) >= 4
 
Concrétement, le plus souvent tu as sizeof(short) = 2.
 
De toute façon, je ne vois pas trop pourquoi tu poses la question, vu que ça devrait avoir aucune influence sur ce que tu programmes.
A+,
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1980641
Un Program​meur
Posté le 03-04-2010 à 13:17:52  profilanswer
 

lassault1 a écrit :

mais moi je veux juste savoir si le type short (2 octets) occupe 1 ou 2 case en mémoire !


 
Sur les machines que tu utilises, probablement.  Ce n'est pas garanti par le langage et des exceptions existent, même hors du champs de l'archéo-informatique.
 
(Note que short ne fait pas nécessairement 2 octets; sur un DSP avec des mots de 24 bits, l'implémentation naturelle serait char, short, int sur 24 bits et long sur 48 bits).
 

gilou a écrit :

Si tu dis que ça fait deux octets, c'est que ca occupe deux cases mémoires, hein.
 
Globalement, ca dépend des plateformes et compilateurs. La seule chose dont tu puisse être sur c'est que:
 sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)


 
Tu peux ajouter sizeof(char) == 1  
 

Citation :


 sizeof(short) >= 2
 sizeof(int) >= 2
 sizeof(long) >= 4


 
Pas vrai.  J'ai pas joué avec mais il y a quelqu'un sur comp.lang.c qui utilise une machine avec sizeof(long long)==1 (je me demande si ce n'est pas à nouveau un Cray).  
 

Citation :

De toute façon, je ne vois pas trop pourquoi tu poses la question, vu que ça devrait avoir aucune influence sur ce que tu programmes


 
+1, mais c'est fou le nombre de gens qui aiment dépendre de détails quand les ignorer simplifierait leur vie.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°1980864
sarlissa
Posté le 04-04-2010 à 21:11:28  profilanswer
 

bonjour je voudrais que vous m'aidiez a développez un programme qui fait la somme de deux grand nombre que l'utilisateur les entre comme des chaines de caractère j'ai essayé de faire le programme m'ai je n'arrive pas à trouver l'emplacement de l'erreur je vous pris de m'aider le plus vite possible
voici mon code:

 


Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include<string.h>
  4.  
  5. int convertir(char *ch,int n);
  6. main()
  7. {char ch1[40],ch2[40];
  8.  int nb1,nb2,n,m,i=9,cos=0,max,t[10]={0};
  9.  printf("entrer le premier nombre:" );
  10.  scanf("%s",ch1);n=strlen(ch1);
  11.  printf("entrer le deuxieme nombre:" );
  12.  scanf("%s",ch2);m=strlen(ch2);
  13.  /*max=(n>m)?n:m;
  14.    d=max/4+3;
  15.    t=(int*)malloc(d*sizeof(int));*/
  16.  while(n>=0 || m>=0)
  17.    {nb1=convertir(ch1,n);
  18.      nb2=convertir(ch2,m);
  19.      t[i]=(nb1+nb2+cos)%10000;
  20.      cos=(nb1+nb2+cos)/10000;
  21.      n-=4;i--;
  22.      m-=4;
  23.    }
  24.  for(i=0;i<10;i++)
  25.    printf("%4d",&t[i]);
  26.  getch();
  27. }
  28.  
  29.  
  30. int convertir(char *ch,int n)
  31. {int i,j=3,nb=0;
  32.  char temp[5];
  33.  if(n>0)
  34.    {
  35.      for(i=n-1;i<=n-5;i--)
  36.        {temp[j]=ch[i];
  37.          j--;
  38.        }
  39.      temp[4]='\0';nb=atoi(temp);
  40.    }
  41.  return(nb);
  42. }

 

et merci d'avance

Message cité 1 fois
Message édité par gilou le 05-04-2010 à 09:24:42
n°1980902
Modération
Posté le 05-04-2010 à 09:17:00  answer
 

sarlissa a écrit :

bonjour je voudrais que vous m'aidiez a développez un programme qui fait la somme de deux grand nombre que l'utilisateur les entre comme des chaines de caractère j'ai essayé de faire le programme m'ai je n'arrive pas à trouver l'emplacement de l'erreur je vous pris de m'aider le plus vite possible  
voici mon code:

Ce qui ne vous autorise en rien à squatter le topic des autres. Créez le vôtre si vous souhaitez une réponse.

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Divers questions en C

 

Sujets relatifs
Comptage des voyelles d'une suite de caracteres, plusieurs questions..[C] Récuperer le nom d'un fichier zip
Questions sur les tableauxlire un fichier .mat en C
[résolu] C#/ process cmd.exe et sequence ALT + <020>ou CTRL+TDépendance C++/cli
[Visual C++ / Qt / OpenGL] LNK2001 : unresolved external symbol[Divers][Gtk] Application avec Gtk (débutant)
Ce qui est déjà disponible de C++0XCUDA - beaucoup (trop ?) de questions
Plus de sujets relatifs à : Divers questions en C


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR