J'ai besoin de déclarer, pour de la lecture de fichier binaires,
des types entiers dont je connais exactement le nombre de bits et le
caractère signé/non_signé.
En C99, #include <stdint.h> et déclaration du genre "int16_t
x1=-16;", et c'est réglé.
Avec certains vieux compilateurs (HP-UX pour ne pas le nommer),
c'était plutôt :
#include <stdlib.h> et déclaration du genre "int32_t x2=-32;", et
stdint.h n'existe pas.
Est-ce que les vieux routard du groupe auraient une solution, c'est
à dire une syntaxe qui marche dans les 2 cas ? (autre que créer moi-même
un stdint.h "kivabien" sur les machines où il n'existe pas)
Ce que je voulais dire, c'est que je ne suis pas absolument absolument absolument absolument convaincu (encore que le contre-exemple m'échappe) qu'une réponse: TYPE_MAX = 2147483647 TYPE_MIN = -2147483648 et [même si je pense que ça redonde]: UTYPE_MAX = 4294967295
signifie obligatoirement TYPE est 32 bits sans padding, signés en complément à 2.
En fait, si, j'en suis convaincu ... [Poil au nez]
Bah, pour les types signes, la norme est remarquablement floue. Par contre, pour les unsigned, c'est a peu pres obligatoire d'avoir de l'implementation en binaire sur n bits...
In article <mn.0c097d7675f13652.31483@laposte.net>,
Pierre Maurette <maurettepierre@wanadoo.fr> wrote:
Ce que je voulais dire, c'est que je ne suis pas absolument absolument
absolument absolument convaincu (encore que le contre-exemple
m'échappe) qu'une réponse:
TYPE_MAX = 2147483647
TYPE_MIN = -2147483648
et [même si je pense que ça redonde]:
UTYPE_MAX = 4294967295
signifie obligatoirement TYPE est 32 bits sans padding, signés en
complément à 2.
En fait, si, j'en suis convaincu ... [Poil au nez]
Bah, pour les types signes, la norme est remarquablement floue.
Par contre, pour les unsigned, c'est a peu pres obligatoire d'avoir
de l'implementation en binaire sur n bits...
Ce que je voulais dire, c'est que je ne suis pas absolument absolument absolument absolument convaincu (encore que le contre-exemple m'échappe) qu'une réponse: TYPE_MAX = 2147483647 TYPE_MIN = -2147483648 et [même si je pense que ça redonde]: UTYPE_MAX = 4294967295
signifie obligatoirement TYPE est 32 bits sans padding, signés en complément à 2.
En fait, si, j'en suis convaincu ... [Poil au nez]
Bah, pour les types signes, la norme est remarquablement floue. Par contre, pour les unsigned, c'est a peu pres obligatoire d'avoir de l'implementation en binaire sur n bits...
Antoine Leca
En news:f3pbid$2r8f$, Marc Espie va escriure:
Ben non, elle n'est effectivement pas garantie. Il existe effectivement des archis exotiques, plutot du cote des DSP, qui ne gerent en natif que des valeurs 64 bits.
Cray, exotiques ? DSP ?
:-)
http://es.wikipedia.org/wiki/64_bits#Cronolog.C3.ADa_del_procesador_de_64_bits http://it.wikipedia.org/wiki/Cray-1#Descrizione (Désolé, les ouiquécrivains francophones sont à la bourre sur ce coup) Et aussi (sous réserves, pas tout vérifié) http://ja.wikipedia.org/wiki/Cray-1#.E8.A9.B3.E7.B4.B0
Antoine
En news:f3pbid$2r8f$1@biggoron.nerim.net,
Marc Espie va escriure:
Ben non, elle n'est effectivement pas garantie. Il existe
effectivement des archis exotiques, plutot du cote des DSP, qui ne
gerent en natif que des valeurs 64 bits.
Cray, exotiques ? DSP ?
:-)
http://es.wikipedia.org/wiki/64_bits#Cronolog.C3.ADa_del_procesador_de_64_bits
http://it.wikipedia.org/wiki/Cray-1#Descrizione
(Désolé, les ouiquécrivains francophones sont à la bourre sur ce coup)
Et aussi (sous réserves, pas tout vérifié)
http://ja.wikipedia.org/wiki/Cray-1#.E8.A9.B3.E7.B4.B0
Ben non, elle n'est effectivement pas garantie. Il existe effectivement des archis exotiques, plutot du cote des DSP, qui ne gerent en natif que des valeurs 64 bits.
Cray, exotiques ? DSP ?
:-)
http://es.wikipedia.org/wiki/64_bits#Cronolog.C3.ADa_del_procesador_de_64_bits http://it.wikipedia.org/wiki/Cray-1#Descrizione (Désolé, les ouiquécrivains francophones sont à la bourre sur ce coup) Et aussi (sous réserves, pas tout vérifié) http://ja.wikipedia.org/wiki/Cray-1#.E8.A9.B3.E7.B4.B0
Antoine
Antoine Leca
En news:, Pierre Maurette va escriure:
Ce que je voulais dire, c'est que je ne suis pas absolument absolument absolument absolument convaincu (encore que le contre-exemple m'échappe) qu'une réponse: TYPE_MAX = 2147483647 TYPE_MIN = -2147483648 et [même si je pense que ça redonde]: UTYPE_MAX = 4294967295
signifie obligatoirement TYPE est 32 bits sans padding, signés en complément à 2.
Supposons que les entiers sont rangés en mémoire dans des cellules de 17 bits, les bits 0,2,3,5,6,8,10,11,13,14 et 16 étant utilisés pour les calculs et les bits 1,4,7,9,12 et 15 servent pour la correction d'erreur.
On prend 3 cellules pour un TYPE (donc 3×17Q bits). Pour éviter les problèmes de calculs, le bit de poids fort n'est pas réutilisé comme bit de signe, donc on a que 3×11-12 bits pour la mantisse, donc les non signés vont de 0 à UTYPE_MAX¹4967295. Pour les nombres signés, plutôt que de prendre TYPE_MAX==-TYPE_MIN==UTYPE_MAX, pour faciliter la conversion avec le système d'exploitation GNU, on a prévu d'utiliser le bit de poids fort des mantisse comme indicateur de la valeur spéciale -0x80000000 (qui pose des tas de problèmes aux systèmes signe+mantisse); donc la valeur de TYPE_MIN s'étend sur 31 bits, jusqu'à 2147483647 inclus ; les nombres négatifs ont une valeur supplémentaire, -2147483648==TYPE_MIN.
Il y a peut-être d'autres exemples plus simples :-).
Antoine
En news:mn.0c097d7675f13652.31483@laposte.net,
Pierre Maurette va escriure:
Ce que je voulais dire, c'est que je ne suis pas absolument absolument
absolument absolument convaincu (encore que le contre-exemple
m'échappe) qu'une réponse:
TYPE_MAX = 2147483647
TYPE_MIN = -2147483648
et [même si je pense que ça redonde]:
UTYPE_MAX = 4294967295
signifie obligatoirement TYPE est 32 bits sans padding, signés en
complément à 2.
Supposons que les entiers sont rangés en mémoire dans des cellules de 17
bits, les bits 0,2,3,5,6,8,10,11,13,14 et 16 étant utilisés pour les calculs
et les bits 1,4,7,9,12 et 15 servent pour la correction d'erreur.
On prend 3 cellules pour un TYPE (donc 3×17Q bits). Pour éviter les
problèmes de calculs, le bit de poids fort n'est pas réutilisé comme bit de
signe, donc on a que 3×11-12 bits pour la mantisse, donc les non signés
vont de 0 à UTYPE_MAX=B94967295.
Pour les nombres signés, plutôt que de prendre
TYPE_MAX==-TYPE_MIN==UTYPE_MAX, pour faciliter la conversion avec le système
d'exploitation GNU, on a prévu d'utiliser le bit de poids fort des mantisse
comme indicateur de la valeur spéciale -0x80000000 (qui pose des tas de
problèmes aux systèmes signe+mantisse); donc la valeur de TYPE_MIN s'étend
sur 31 bits, jusqu'à 2147483647 inclus ; les nombres négatifs ont une valeur
supplémentaire, -2147483648==TYPE_MIN.
Il y a peut-être d'autres exemples plus simples :-).
Ce que je voulais dire, c'est que je ne suis pas absolument absolument absolument absolument convaincu (encore que le contre-exemple m'échappe) qu'une réponse: TYPE_MAX = 2147483647 TYPE_MIN = -2147483648 et [même si je pense que ça redonde]: UTYPE_MAX = 4294967295
signifie obligatoirement TYPE est 32 bits sans padding, signés en complément à 2.
Supposons que les entiers sont rangés en mémoire dans des cellules de 17 bits, les bits 0,2,3,5,6,8,10,11,13,14 et 16 étant utilisés pour les calculs et les bits 1,4,7,9,12 et 15 servent pour la correction d'erreur.
On prend 3 cellules pour un TYPE (donc 3×17Q bits). Pour éviter les problèmes de calculs, le bit de poids fort n'est pas réutilisé comme bit de signe, donc on a que 3×11-12 bits pour la mantisse, donc les non signés vont de 0 à UTYPE_MAX¹4967295. Pour les nombres signés, plutôt que de prendre TYPE_MAX==-TYPE_MIN==UTYPE_MAX, pour faciliter la conversion avec le système d'exploitation GNU, on a prévu d'utiliser le bit de poids fort des mantisse comme indicateur de la valeur spéciale -0x80000000 (qui pose des tas de problèmes aux systèmes signe+mantisse); donc la valeur de TYPE_MIN s'étend sur 31 bits, jusqu'à 2147483647 inclus ; les nombres négatifs ont une valeur supplémentaire, -2147483648==TYPE_MIN.
Il y a peut-être d'autres exemples plus simples :-).