|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
![]() ![]() Cyrille Network programmer Inscription : juin 2010 Messages : 1 570 ![]() |
Dans ce deuxième article sur le C++ bas niveau, Alex Darby aborde les types de données et leurs représentations internes.
Programme d'étude sur le C++ bas niveau n° 2 : les types de données Quels sont les points les plus importants pour vous à connaître sur les types ? Connaissez-vous d'autres subtilités sur les types de données ?Bonne lecture. Retrouver l'ensemble des articles de cette série sur la page d'index. |
|
|
50
|
|
|
#2 |
|
Membre chevronné
![]() Inscription : janvier 2009 Messages : 401 ![]() |
Bonjour,
Merci pour cette article. Cependant, le format PDF et autres ne sont téléchargeable. Merci de procéder aux modifications nécessaires A+ |
|
|
00
|
|
|
#3 | |
|
Invité de passage
![]() Ingénieur développement logiciels Inscription : avril 2012 Messages : 2 ![]() |
Citation:
Il me semble que le terme octet signifie 8 bits donc octet > 8 est impossible. AMHA le terme "information codée sur" xx bits conviendrait mieux. |
|
|
|
00
|
|
|
#4 |
|
Expert Confirmé Sénior
![]() ![]() ![]() Guillaume BelzBiochimiste Inscription : novembre 2008 Messages : 5 294 ![]() |
@seabs
Merci, c'est corrigé @giltt En effet, c'est un abus de langage que d'assimiler octet et byte, un octet faisant toujours 8 bits, ce qui n'est pas le cas des bytes. Comme pour les cpu "classiques", c'est pareil, on traduit souvent byte par octet, mais dans le contexte, c'est effectivement incorrecte. J'ai corrigé l'article pour utiliser byte partout
__________________
Merci à toutes les bénévoles avec qui j'ai travaillé sur les rubriques C++, Qt et Jeux. Retrouvez mes anciennes publications sur GitHub et suivez mes futures publications sur Google+. Apprendre Qt 5 : vidéos d'installation (YouTube), extraites du livre Créer des applications avec Qt 5. |
|
00
|
|
|
#5 | |
![]() ![]() ![]() |
Bonjour,
Bon article mais j'ai tiqué sur un point : Citation:
Il me semblait que les tous premiers char étaient sur moins de 8 bits et qu'en embarqué on peut parfois se trouver avec des char de 6-7 bits.
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon. Chaîne Youtube : Vidéos Ma page DVP : http://neckara.developpez.com/ |
|
|
|
00
|
|
|
#6 |
![]() ![]() Florian BlanchetEtudiant en Optique Inscription : août 2004 Messages : 1 112 ![]() |
@Neckara:
__________________
"We can solve any problem by introducing an extra level of indirection" Butler Lampson "N'importe quel problème peut être résolu en introduisant un niveau d'indirection supplémentaire" Butler Lampson (traduction libre) |
|
|
00
|
|
|
#7 | |||
|
Expert Confirmé Sénior
![]() ![]() ![]() Inscription : novembre 2005 Messages : 4 970 ![]() |
Citation:
Citation:
Citation:
(*) Il y a eu des implémentations ayant des modes non conformes sur ce point pour des raisons d'interopérabilité avec le système, mais celle que je connais avait un mode conforme (avec des bytes sur 9 bits).
__________________
Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça. |
|||
|
|
00
|
|
|
#8 |
![]() ![]() Florian BlanchetEtudiant en Optique Inscription : août 2004 Messages : 1 112 ![]() |
@Jean-Marc.Bourguet: En effet, j'ai oublié que la norme C++ inclut (entre autre) celle du C en ce qui concerne climits, et qui fixe le nombre minimum de bits à 8. Autant pour moi.
__________________
"We can solve any problem by introducing an extra level of indirection" Butler Lampson "N'importe quel problème peut être résolu en introduisant un niveau d'indirection supplémentaire" Butler Lampson (traduction libre) |
|
|
00
|
|
|
#9 |
|
Expert Confirmé
![]() Développeur informatique Inscription : décembre 2008 Messages : 777 ![]() |
"Aussi loin que je l'ai découvert, les standards C et C++ ne donnent aucune garantie sur les tailles des types de base."
Le C99 à amené les types UintXX_t qui sont soit Unsigned soit signed, et sont codés sur exactement XX bits. Dans le même genre, il y a ceux qui ont au moins XX bits, et ceux qui sont optimisés. J'ai très vite pris le "int" de base en horreur, et quand j'ai découvert ces types, j'en suis tombé amoureux: quoi de mieux pour faire un programme portable que de connaître la portée réelle des types? Puisque, comme dis dans l'article, les types habituels n'ont absolument aucune fiabilité en terme de taille, et donc de plage de valeurs (le "int" est une excellente preuve d'ailleurs: on a soit un mot, soit un double mot, selon qu'on soit en 16 ou 32 bits). Je n'ai en revanche jamais été trahis par short et long (mes 1eres lignes de code ASM / C étaient sur processeur intel en mode réel, d'où ma haine du type int qui m'a trahis une ou deux fois). CF: stdint.h "Le standard C spécifie une valeur que chaque type entier doit être capable de représenter " de représenter quoi? La phrase se fini sur une référence... mais éplucher le standard, comment dire... Par rapport aux énumérations, je souhaite indiquer qu'il me semble que C++11 (ou est-ce le C11?) a apporté des contrôles sur la façon dont une structure occupe l'espace mémoire, laissant aux développeur le choix de la densité mémoire (vu qu'un processeur 32bits manipule plus vite les doubles mots que les mots, comparé à un processeur 16 bits de même fréquence, si je me plante pas). "ce qui explique pourquoi les systèmes win32 ne peuvent pas utiliser plus de 4 Go de mémoire." C'est juste que la médiocrité du kernel windows n'est pas que une rumeur. Et d'ailleurs, même si je doute que les windows 32 bits pour les utilisateurs soient effectivement capable d'adresser 64Gio quand compilés en 32bits, je doute que les versions serveur n'en soient pas capables. "Vous devez faire attention avec les types numériques dans le standard C, les int et short ont la même valeur limite à stocker (unsigned int et unsigned short ont tous deux 0xFFFF (i.e. 16 bits)). Je n'ai jamais eu de problème avec ça, mais un int pourrait être représenté par 16 bits." D'un côté tu dis qu'un int pourrait être stocké sur 16 bits, et de l'autre tu dis qu'un int pourrait être représenté sur 16 bits??? Bon, a part ça, mes constatations personnelles, c'est que, si le programme est compilé avec le compilo borland pour générer un binaire 16 bits, int sera sur 16. Si pour 32, int sera sur 32 (la raison pour laquelle je m'en sers pas est d'ailleurs que j'ai longtemps programmé en mode réel, c'est à dire sur intel 16 bits). J'imagine que pour une bécane 64bits, ce sera 64... Voili voilou mes impressions. Sinon, bonne initiative. J'ai personnellement eu une passe ou je me suis intéressé de très près au reverse engineering (bon, ok, cracking), à l'assembleur et au BIOS, même si elle date. Je pense que ça m'aide énormément dans ma compréhension du fonctionnement d'un programme (dans le genre intéressant, il y a aussi les fameux ring, ou niveaux d'exécutions). J'avais d'ailleurs beaucoup appris de tuto asm de dvp, et de 2 autres documents dispos sur la toile: _ les secrets du BIOS PC/AT (je crois) qui traitait d'assembleur et des routines d'interruptions du BIOS _ un ouvrage qui décrivait pas à pas comment écrire son kernel (mais je m'étais arrêté presque au début: ces histoires de mode réel/protégé et la complexité de la gestion de la mémoire m'ont fait fuir) PS: Visual Studio n'est pas vraiment une référence en terme de standard. Je tiens à rappeler que microsoft ne supporte toujours pas stdint.h par exemple, donc il faudrait cesser de se fier à ce compilateur pour jauger le standard. Et je ne dis pas ça pour troller... J'ai eu de mauvaises expériences à ce sujet, notamment avec 2005, et bien qu'ils se soient améliorés, il n'empêchent qu'ils ne respectent toujours pas certains trucs élémentaires. Pour mettre les choses entre parenthèses, il me semble qu'un seul compilateur (et ce n'est pas GCC, je vois venir les trolls) implémente les normes de 99 entièrement, à cause d'une fonctionnalité qu'ils ont d'ailleurs chaudement recommandé aux autres de NE PAS faire |
|
|
00
|
|
|
#10 | ||||
![]() ![]() Cyrille Network programmer Inscription : juin 2010 Messages : 1 570 ![]() |
Citation:
Si le standard dit qu'un int doit pouvoir stocker 65535, rien n'empêche l'implémentation de pouvoir stocker 99999. Mais c'est implémentation spécifique. Citation:
Citation:
Citation:
Oui int est le piège typique. Et il faudrait favoriser au moins short et long. |
||||
|
|
00
|
|
|
#11 |
![]() ![]() ![]() |
Je vais sûrement dire une bêtise mais l'int n'est-il pas défini comme le type optimal pour effectuer des calcul en un seul cycle CPU?
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon. Chaîne Youtube : Vidéos Ma page DVP : http://neckara.developpez.com/ |
|
|
00
|
|
|
#12 | |
|
Expert Confirmé Sénior
![]() ![]() ![]() Inscription : novembre 2005 Messages : 4 970 ![]() |
Citation:
En passant, si on se limite aux desktops, stations de travails et serveurs (en excluant donc l'embarque, ou il y a plus de variete, et les machines historiques, dont je doute qu'elles soient programmees en C ou en C++) le seul type de taille variable est long qui est sur 32 bits (pour les implementations ILP32, autrement dit 32 bits, et LLP64, Windows) ou sur 64 bits (pour les implementations LP64, Unix).
__________________
Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça. |
|
|
|
00
|
|
|
#13 | |||||||
|
Expert Confirmé
![]() Développeur informatique Inscription : décembre 2008 Messages : 777 ![]() |
Désolé, c'est vrai que j'aurai du citer:
Citation:
A titre d'info, wikipedia m'indique que le pentium pro date de 1995, bien avant l'arrivée du 64bits. Citation:
"les int et short ont la même valeur limite à stocker ([...](i.e. 16 bits)).[...]un int pourrait être représenté par 16 bits" Tu te répètes, non? Pour tout le reste de ce que tu cites et réponds, j'ai un test pour toi, vu que tu sembles penser que les spécificités d'implémentations sont rares. Il te faudra 2 compilateurs, plutôt répandus: Visual C++ 2008 et MinGW32. Compiles et exécutes le code suivant sur chacun d'eux. J'insiste, j'ai essayé uniquement avec C++, le C agira peut-être de la même façon dans les deux cas (ces langages ne sont pas les mêmes après tout) Code c++ :
Ce bout de code n'a rien à voir avec la taille des types, je te l'accorde. Son seul rôle est de te montrer que les spécifités d'implémentation doivent être prises au sérieux, car les résultats obtenus avec ces deux compilateurs diffèrent, et sont pourtant tous deux standard! Quand j'ai utilisé cette astuce pour un code, j'avais "communément admis" que l'ordre de passage des données à une fonction était fixe, normé, standard, ce qui est entièrement faux: cela dépend du contexte (en gros, seul le cas ou le retour d'une fonction est attendu est fixe, si c'est une expression, le compilateur est libre de faire les "optimisations" qu'il veut. J'ai perdu 2 jours à comprendre pourquoi ce bout de code ne marchait pas sous windows mais marchait sur ma machine perso. Bizarrement, j'ai accusé sans savoir VS de merder )Citation:
C'est justement ce flou volontaire qui fait que ces langages sont portables. La portabilité dont je parle ici est celle de la machine, de l'OS, ET du compilateur. Si tout était fixé, un compilateur ou un autre n'auraient aucune importance. Citation:
qui signifie que le standard indique le nombre de valeurs minimum qui doit être supporté, mais pas le maximum. Aussi, un int de 18 bits serait tout à fait standard, même si spécifique à son implémentation. Les langages C et C++ sont conçus pour leur portabilité avant même leur performance, et imposer des tailles précises pour un type empêcherait les deux. Quant au "communément admis"... cf mon exemple plus haut. En toute honnêteté, quel résultat pensais-tu avoir avant de faire le test? Le même sur chaque compilo? Dans mon esprit, il était communément admis que "cdecl" était valide en C++ quelle que soit la situation... "les archis 32 bits étant la norme depuis un moment, et bientôt les 64 bits" Ce n'est pas une norme, c'est juste répandu. Si un industriel avait un besoin d'une puce plus petite et que pour cela il doive avoir un système fonctionnant avec 8 bits (je dis n'importe quoi hein) ou bien le contraire, 128, des programmes C et C++ bien écrits devraient être capables de s'exécuter sans modification des sources (mais en recompilant) sur ces machines (en admettant que les capacités matérielles soient suffisantes pour charger les programmes en mémoire, bien entendu). Il faut se méfier de ce que l'on pense être la norme, et se rappeler que C et C++ sont deux langages différents (bien que mon exemple adapté au C, semble causer le même problème compilé en C qu'en C++). Citation:
cf: http://pwet.fr/man/linux/conventions/posix/stdint_h (contrairement au fait que ce soit un man, qui parle de POSIX, il s'agit du standard C99: http://fr.wikipedia.org/wiki/Bibliot...es_ANSI_et_ISO [edit] désolé pour le long post, et désolé pour le 1er pas toujours assez clair, je l'admets. |
|||||||
|
|
00
|
|
|
#14 | ||||||
![]() ![]() Cyrille Network programmer Inscription : juin 2010 Messages : 1 570 ![]() |
Citation:
Au jour d'aujourd'hui où le pc standard est un 32bits, il est plus ou moins admis qu'un int sera 32bits, le mot naturel du proc. Mais la norme ne spécifie rien de plus pour le int que de pouvoir stocker 65535. Et donc on peut avoir un int représenté de 16bits (qui suffit à stocker cette valeur max). Citation:
Je m'en suis aperçu en lisant une documentation sur le développement PSP lors de mon stage, et sur le coup ça m'avait surpris. De même que le mot-clé volatile existe pour guider le compilateur dans certaines de ses optimisations. Citation:
La norme dit, ni plus ni moins, qu'un int doit pouvoir stocker 65535. Elle n'interdit pas de stocker plus grand, mais il ne doit pas avoir une limite plus basse. De même qu'un int de 18bits n'a rien de standard. La norme ne l'interdit pas, mais le standard du jour ça reste le 32 bits aux yeux de la grande majorité. Quand tu travailles avec ce genre de bestioles, tu es au courant d'une telle spécificité. Mais je le répète : ça reste une spécificité. Fusse-t-elle non interdite par la norme. Citation:
Quand je bosserai sur un système où un int devra faire 8 bits, je m'y adapterai. Mais ça ne sera pas du tout normal, on s'y pliera. Quand on parle de spécificités de ce type on est quand même bien loin de la normale. Et on sait y faire face normalement. |
||||||
|
|
00
|
|
|
#15 |
|
Expert Confirmé
![]() Développeur informatique Inscription : décembre 2008 Messages : 777 ![]() |
D'accord, je comprends mieux ce que tu voulais dire du coup.
Je suis curieux de voir la raison pour laquelle ils t'ont expliquer que l'ordre des paramètres change? Parce que dans mon cas, c'était une astuce pour appeler une fonction dont le programme ne connaît pas lui-même le nombre d'arguments... le genre de bestiole qu'on ne voit pas tous les jours
|
|
|
00
|
|
|
#16 | |
![]() ![]() Cyrille Network programmer Inscription : juin 2010 Messages : 1 570 ![]() |
Citation:
De mémoire, en gros, avec un code comme ça : Code :
MyFunction(doSomething(1), getFrom(a)); Problèmes évidents en vue si les méthodes utilisent/modifient un même paramètre, ou font de la tambouille interne sur une même classe.
|
|
|
|
00
|
|
|
#17 |
|
Expert Confirmé
![]() Développeur informatique Inscription : décembre 2008 Messages : 777 ![]() |
C'est étrange, parce qu'il me semble justement que lorsque l'on appelle des fonctions/méthodes pour utiliser leur résultat directement dans une fonction, alors les fonctions doivent être résolues dans un ordre précis (d'où ma solution qui avait été de faire une fonction inline, justement)...
Va falloir que je refasse quelque recherches, j'aimerai pas retomber dans ce piège... (et d'ailleurs, l'ordre "logique" est de résoudre le dernier paramètre en premier. Passer le 1er en 1er, c'est ce que fait le pascal, si je ne m'abuse) |
|
|
00
|
|
|
#18 | ||||
|
Expert Confirmé Sénior
![]() ![]() ![]() Inscription : novembre 2005 Messages : 4 970 ![]() |
Citation:
- la taille des adresses dans un processus - la taille des adresses physiquement disponible - la taille des adresses physique prevue par l'architecture. Quand on dit qu'une machine 32 bits adresse 4GB au maximum, on parle de la premiere. PAE permet d'etendre la troisieme jusqu'a 64GB, les processeurs 32 bits ont en pratique quelque chose entre les deux. (Bon, vu que ca fait un bon moment que les processeurs sont 64 bits, la taille maximales adresses physiques tournent autour entre 40 et 50 bits et plus 36; je ne sais pas a quel point il y a une limite architecturale inferieure a 64 bits, c'est un aspect que j'ai jamais regarde). Citation:
Citation:
Ta ligne 14 est un cas de comportement indefini bien connu aussi (autrement dit, l'implementation peut faire ce qu'elle veut a partir du moment ou elle est sure que le code est execute, j'ai meme vu des comportement "non causaux" -- elle supposait qu'un comportement indefini -- pas celui-la -- n'avait pas lieu, ce qui limitait les valeurs possibles et avait donc determine qu'un test anterieur etait toujours faux et l'avait vire ainsi que le code correspondant). Citation:
Note que quelque chose d'impose par une norme (au sens de document sortant d'un organisme de normalisation) peut etre en pratique moins reliable que quelque chose de moins formel. Certains s'amusent a faire des nuances entre "norme" et "standard", ca peut aider quand on est au courant, mais de telles nuances sont loins d'etre universelles.
__________________
Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça. |
||||
|
|
00
|
|
|
#19 | |
![]() ![]() Loïc JolyDéveloppeur informatique Inscription : août 2004 Messages : 4 698 ![]() |
Citation:
__________________
Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11. |
|
|
|
10
|
|
|
#20 | |
|
Expert Confirmé
![]() Développeur informatique Inscription : décembre 2008 Messages : 777 ![]() |
Citation:
En l'occurrence, j'avais eu recours à cette "technique" (très sale, j'en conviens) parce que je devais appeler une fonction dont le compilateur n'a aucune idée du nombre d'arguments. Contrairement au développeur... Une sorte de génération de code en live quoi. Pour ceux qui connaissent, il s'agit "d'injecter" du code natif dans une application utilisant powerbuilder. Vue la tronche de l'API (qui prétends être écrite en C++ mais en fait il s'agit de C with classes version plug-in, c'est à dire avec des structures au lieu des classes, entres autres) j'avais eu à en encapsuler une bonne partie. Et comme les fonctions/méthodes de PB n'ont pas de nombre d'arguments déterminé à l'avance, et que l'on me demandait un système automatisé au maximum... j'ai fait ce que j'ai pu (et pas le droit aux dépendances externes, ni au tr1 vu que ça doit compiler avec VS2008 naturellement). |
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com