Code format d'un double %f ou %lf ? Ou avoir + d'info sur long? [c] - C - Programmation
Marsh Posté le 02-06-2004 à 02:08:45
Pour un double c'est %f qui est utilisé, le 'l' n'est applicable que sur des entiers et est ignoré.
Pour connaître le nombre d'octets, tu peux utiliser sizeof().
Sinon, généralement sur unix de nos jours et sauf erreur de ma part, les longs et int sont sur 32, les long long sur 64, les short sur 16.
Tu peux aussi utiliser les séries int64, int32, int16 ...
Marsh Posté le 02-06-2004 à 02:31:34
En général (ce qui ne veux rien dire) les long sont 32 si compilés en 32 bits, et 64 si compilés en 64 bits. En général toujours, les int font 32 bits et les long long 64 bits, quel que soit le mode.
Pour connaître la taille en bits d'un type, fait « sizeof (type) * CHAR_BIT » (et oui, un char ne fait pas forcément 8 bits). Si tu veux juste savoir la plus grande quantité que peux contenir un type de base, utilise les INT_MAX, UINT_MAX...
Tout ça est dans limits.h et dépend de l'architecture.
Ah et puis pour réponde à ta question, ce n'est pas %l pour les long mais %ld ou %lu, suivant que tu veux du signé ou non signé. Et pour long long c'est %lld ou %llu. Les « l » et « ll » sont des modificateurs qui s'insèrent avant le type qui suit (d, u, x, X).
Marsh Posté le 02-06-2004 à 02:42:58
int32 t; n'a pas l'air de trop passer ...
Citation : amusant/client.c:259: error: `int32' undeclared (first use in this function) |
je viens de faire un petit sizeof vite fais et en effet tu as raison
int et long => 32
long long => 64
mais alors a quoi ca sert le int ?
les bornes de int et de long sont bien
0 -> 2^32 en non signé
ou en signé de - 2^32/2 -> 2^32/2
Marsh Posté le 02-06-2004 à 02:44:36
oulala je me suis fais grilled
je regarderais ca demain
merrci pour vos reponses
Marsh Posté le 02-06-2004 à 04:31:14
Code :
|
Marsh Posté le 02-06-2004 à 07:15:40
vivelec a écrit : Pour un double c'est %f qui est utilisé, le 'l' n'est applicable que sur des entiers et est ignoré. |
weed > en fait, c'est simple, c'est juste que le format diffère à l'affichage et à la saisie
affichage -> %f pour les double et float (puisque le double va être converti)
lecture -> double %lf , float %f
vivelec > et me sort pas que c'est pas standard
Marsh Posté le 02-06-2004 à 07:17:03
matafan a écrit :
|
pas portable donc. y a tout ce qu'il faut en C99 dans <stdint.h>
Marsh Posté le 02-06-2004 à 08:20:13
Taz a écrit : |
et ya pas un truc qui s'appelle la promotion des parametre et qui converti les float en double ou c'est juste c pre ansi (k&r) ?
Marsh Posté le 02-06-2004 à 08:35:08
oups j'ai fait une erreur
-> (puisque le double^Wfloat va être converti)
si. mais uniquement en entrée évidemment, ton float* tu peux le faire passer en double*, mais ça cassera. dans l'autre sens aussi.
Marsh Posté le 02-06-2004 à 09:01:30
Taz a écrit : weed > en fait, c'est simple, c'est juste que le format diffère à l'affichage et à la saisie |
Tout dépend de tes standards ...
Sous UNIX et non sous linux, effectivement ce n'est pas "standard", du moins, le 'l' est ignoré.
Marsh Posté le 02-06-2004 à 16:55:03
oki je comprends mieux
merci a vous tous ...
j'ai fais comme a dis matafan :
Code :
|
mais que vois je :
Code :
|
int = long = (2^32)/2-1
est ce que je me suis trompé ?
sinon pour info :
Code :
|
Marsh Posté le 02-06-2004 à 20:32:19
vivelec a écrit : Tout dépend de tes standards ... |
et allez, ça repart ... non mais non seulement de raconter des conneries tu dis des trucs dangereux. et tu te dis expert ? et ben mon Dieu !
%lf est tout a fait standard et ANSI
tu commences à nous saouler : ON EN A RIEN A FOUTRE SI T'ES TROP NUL POUR T'INSTALLER UN COMPILATEUR C
Marsh Posté le 02-06-2004 à 20:32:57
matafan a écrit : Qu'est-ce qui ne te semble pas normal ? |
rien, sur système 32 bits, il se trouve que sizeof(long) == sizeof(int)
Marsh Posté le 02-06-2004 à 23:03:16
Taz a écrit : et allez, ça repart ... non mais non seulement de raconter des conneries tu dis des trucs dangereux. et tu te dis expert ? et ben mon Dieu ! |
Qu'est-ce qu'elle a la petite merde ?
T'as tes règles ?
Prends du spafon cocotte et fais pas chier.
Marsh Posté le 02-06-2004 à 23:05:05
Taz a écrit : rien, sur système 32 bits, il se trouve que sizeof(long) == sizeof(int) |
Et je dirais que petite merde encore, sur 64 bits c'est la même chose.
Il n'y a plus de distinction entre le int et le long depuis que l'on a tous migré sur des archis en 32 bits.
Marsh Posté le 02-06-2004 à 23:11:53
vivelec a écrit : Qu'est-ce qu'elle a la petite merde ? |
ce serait cool de rester poli.
Marsh Posté le 02-06-2004 à 23:16:17
black_lord a écrit : ce serait cool de rester poli. |
Ce n'est qu'un échange de bon procédés avec Taz.
Rien de bien méchant.
Marsh Posté le 02-06-2004 à 23:45:32
"Qu'est-ce qui ne te semble pas normal ? "
ce que retourne INT_MAX et LONG_MAX c'est qui me chagrine :
INT_MAX 2147483647, UINT_MAX 4294967295, LONG_MAX 2147483647
long sert strictement a rien alors ???? si c'est tous les 2 : 2147483647
c'est bien 32 bits 2^32/2-1, je pensais que la taille ne voulait rien dire du fait que int ne soit pas compilé et le long compilé et que INT_MAX < LONG_MAX
mais il y a un long beaucoup plus long (ouou, le jeux de mots )
Citation : # define INT_MAX 2147483647 |
Marsh Posté le 02-06-2004 à 23:47:46
et puis SVP, restez calme
je ne sais pas qui a raison, mais que vous avez tous les 2, vivelec et taz, un tres tres bon niveau en linux/unix
Marsh Posté le 02-06-2004 à 23:51:34
weed a écrit : et puis SVP, restez calme |
Ce n'est pas une question d'avoir un bon niveau ou non, les métiers de l'informatique sont diverses et à chacun sa spécialité.
Cependant, la courtoisie et le respect sont des minimums, tant qu'ils sont réciproques.
Ce qui n'est pas toujours le cas.
Marsh Posté le 02-06-2004 à 23:53:56
weed a écrit : "Qu'est-ce qui ne te semble pas normal ? "
|
Cela ressemble à du linux.
Il est préférable d'adopter des conventions héxas pour tout ce qui a trait à du binaire.
Marsh Posté le 02-06-2004 à 23:59:16
"Il est préférable d'adopter des conventions héxas pour tout ce qui a trait à du binaire. "
dsl mais je comprends pas du tout
ou vois tu de l'hexa et pourquoi me parle de binaire ?
Marsh Posté le 03-06-2004 à 00:12:26
weed a écrit : "Il est préférable d'adopter des conventions héxas pour tout ce qui a trait à du binaire. " |
Tu remarqueras par exemple que 9223372036854775807L correspond à 7FFFFFFFFFFFFFFF qui correspond donc à la valeur max d'un 64 bits signé, soit -9223372036854775807 à +9223372036854775807.
Sur un 64 bits non signé, tu aurais droit à la plage 0 - 18446744073709551615.
Sur la majorité des plateformes, le bit de signe est en effet positionné sur le bit de poids fort.
Généralement, pour tout ce qui a trait à la manipulation de bits ou d'octets, on choisit l'octal ou l'héxa.
Marsh Posté le 03-06-2004 à 00:18:31
vivelec a écrit : Et je dirais que petite merde encore, sur 64 bits c'est la même chose. |
mais dis donc, tu me parais avoir une sacré expérience mon gars ... manqué sur beaucoup d'architecture 64bits, l'int fait 32bits et le le long fait nativement 64bits.
Marsh Posté le 03-06-2004 à 00:21:45
vivelec a écrit : Cela ressemble à du linux. |
ah ouais, moi aussi, je reconnais cette manière d'indenter.
weed > il est bizarre ton limits.h ...
cela dit, la norme impose que sizeof(int) <= sizeof(long) <= sizeof(long long)
sur X86 32bits, l'int et le long font 32bits, le long long 64bits, le contrat est respecté
Marsh Posté le 03-06-2004 à 00:28:50
Taz a écrit : mais dis donc, tu me parais avoir une sacré expérience mon gars ... manqué sur beaucoup d'architecture 64bits, l'int fait 32bits et le le long fait nativement 64bits. |
Es-tu vraiment sûr de ce que tu annonces ?
Ceci dit, je commençais à déspérer de ton absence.
Mais suis-je bête, on est jeudi, jour de congé pour les estudiantains !
Tes injures m'ont manquées à vrai dire.
Encore !
Marsh Posté le 03-06-2004 à 00:38:51
En fait, et là, si tu as les preuves qui vont bien et pas sur linux, stp, les int et les longs sont codés sur 32 bits quelque soit la plateforme.
Ceci dit, j'aurais tendance à croire la même que toi.
Marsh Posté le 03-06-2004 à 00:41:24
vivelec a écrit : En fait, et là, si tu as les preuves qui vont bien et pas sur linux, stp, les int et les longs sont codés sur 32 bits quelque soit la plateforme. |
K&R. il a juste une relation d'ordre imposé entre les tailles et des capacité minimales à fournir. on trouve donc des architectures où sizeof(int) == 4 et donc sizeof(long) == sizeof(void*) == 8
Marsh Posté le 03-06-2004 à 00:58:02
et bien en tout cas
je suis vraimenent decu
j'ai eu l'occasion de programmer sur du C borland sous win32sur une architecture 32 bits, c'est peut etre pas du C trop standard mais le long etait plus long que ca ...
bon allez bonne nuit
Marsh Posté le 03-06-2004 à 01:21:45
Taz a écrit : K&R. il a juste une relation d'ordre imposé entre les tailles et des capacité minimales à fournir. on trouve donc des architectures où sizeof(int) == 4 et donc sizeof(long) == sizeof(void*) == 8 |
Vérifie par toi même, mais sizeof(void) n'est pas égal à 8 en dehors de linux.
Marsh Posté le 03-06-2004 à 01:28:48
vivelec a écrit : Vérifie par toi même, mais sizeof(void) n'est pas égal à 8 en dehors de linux. |
déjà je parle de sizeof(void*) et sur un système 64bits, encore heureux que sizeof(void*) == 8
Marsh Posté le 03-06-2004 à 01:31:12
vivelec a écrit : Vérifie par toi même, mais sizeof(void) n'est pas égal à 8 en dehors de linux. |
tiens :
http://www.codeproject.com/cpp/FastDelegate.asp
matte un coup le chapitre "Implementations of Member Function Pointers"
la colonne "DataPtr"
[edit] oups, c'est du C++, mais bon la remaque reste valide
Marsh Posté le 03-06-2004 à 01:33:50
SquiZZ a écrit : tiens : |
ah ben non, et ho, les systèmes 64bits, faudrait pas non plus qu'ils puissent addresser 64bits
Marsh Posté le 03-06-2004 à 01:41:23
Taz a écrit : ah ben non, et ho, les systèmes 64bits, faudrait pas non plus qu'ils puissent addresser 64bits |
Donne-moi alors un vrai os 64 bitd, et je teste.
Rien ne vaut l'empirisme ..
Marsh Posté le 03-06-2004 à 01:42:05
vivelec a écrit : Donne-moi alors un vrai os 64 bitd, et je teste. |
Oups, j'oubliais, tout sauf linux.
Marsh Posté le 02-06-2004 à 01:56:13
bon je suis un peu perdu
Taz m'avais dis %f et le man 3 printf l'a comfirmé
or le C que j'ai appris et sur le site http://www.iota-six.co.uk/c/c2_printf_and_scanf.asp, c'est %lf !!!!
deplus d'apres le man, le float a completement disparu ....
bon normallement je dois plutot croire le man de mon syteme
j'etais au courant a propos des int qui pouvait prendre soit 2 ou 4 octets
mais la bizzare, ca me surprends .....
sinon comment puis je savoir sur combien de bits sont les int sur mon systeme, y a t'il une page man ?
je dois pouvoir utiliser des nombre de 0 à 2 ^(32) -1
donc normallement ca passe juste juste en non signé mais je pense utiliser des long pour etre tranquille mais quel code format utilisé ? %l ???
MODIFICATEUR DE LONGUEUR
Ici, une conversion entière correspond à d, i, o, u, x, ou X.
hh La conversion entière suivante correspond à un signed char ou
unsigned char, ou la conversion n suivante correspond à un argu-
ment pointeur sur un signed char.
h La conversion entière suivante correspond à un short int ou
unsigned short int, ou la conversion n suivante correspond à un
argument pointeur sur un short int.
l (elle) La conversion entière suivante correspond à un long int
ou unsigned long int, ou la conversion n suivante correspond à
un pointeur sur un long int, ou la conversion c suivante corre-
spond à un argument wint_t, ou encore la conversion s suivante
correspond à un pointeur sur un wchar_t.
ll (elle-elle) La conversion entière suivante correspond à un long
long int, ou unsigned long long int, ou la conversion n suivante
correspond à un pointeur sur un long long int.
L La conversion a, A, e, E, f, F, g, ou G suivante correspond à un
argument long double. (C99 autorise %LF mais pas SUSv2).
q (`quad' BSD 4.4 et Linux sous libc5 seulement, ne pas utiliser)
Il s'agit d'un synonyme pour ll.
j La conversion entière suivante correspond à un argument intmax_t
ou uintmax_t.
z La conversion entière suivante correspond à un argument size_t
ou ssize_t. (La bibliothèque libc5 de Linux proposait l'argu-
ment Z pour cela, ne pas utiliser).
t La conversion entière suivante correspond à un argument
ptrdiff_t.
je suis assez impressionné par le nombre de type de valeur qui existe sur mon systeme
h => short int
I => long int
ii => long long int
L => long double
je pense que c'est un long int qui me faudrait mais comment connaitre les plges de nombre que je peux utiliser ou sinon la taille des variables. N'existe t'il pas de page man pour avoir un peu plus de precisions ?
Message édité par weed le 02-06-2004 à 01:57:01