Je suis confondu avec la plage de valeurs de la variable Int en C.
Je sais que 32 bits non signés int ont une gamme de: 0 à 65 535 . Si longtemps a 0 à 4 294 967 295
C'est bien dans la machine 32bits. Mais maintenant, dans les machines 64bits, tout reste-t-il identique?
Je comprends ces questions en tant que débutant, mais je suis vraiment confus. Cette signature de méthode n'aide pas trop. :)
unsigned long long int atomicAdd(unsigned long long int* address, unsigned long long int val);
En C et C++, vous avez ces exigences minimales (c’est-à-dire que les implémentations réelles peuvent avoir des grandeurs plus grandes)
signed char: -2^07+1 to +2^07-1
short: -2^15+1 to +2^15-1
int: -2^15+1 to +2^15-1
long: -2^31+1 to +2^31-1
long long: -2^63+1 to +2^63-1
Maintenant, sur des implémentations particulières, vous avez une variété de plages de bits. L'article de wikipedia le décrit bien.
Non, int
en C est pas défini comme étant 32 bits. int
et long
ne sont pas définis comme ayant une taille spécifique. La seule chose que le langage garantit est que sizeof(char)<=sizeof(short)<=sizeof(long)
.
Théoriquement, un compilateur pourrait faire short
, char
et long
tout le même nombre de bits. Je connais certains qui ont réellement fait cela pour tous ces types sauf char
.
C'est pourquoi C définit maintenant des types tels que uint16_t
et uint32_t
. Si vous avez besoin d'une taille spécifique, vous êtes censé en utiliser une.
Extrait de K & R:
short
est souvent 16 bits,long
32 bits etint
16 bits ou 32 bits. Chaque compilateur est libre de choisir les tailles appropriées pour ses propres matériel, sous réserve uniquement de la restriction queshort
s etint
s soient au moins 16 bits,long
s au moins 32 bits etshort
à non. plus long queint
, lequel n’est pas plus long quelong
.
Vous pouvez utiliser limits.h
qui contient la définition des limites pour les types decimal/float:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <float.h>
int main(int argc, char** argv) {
printf("CHAR_BIT : %d\n", CHAR_BIT);
printf("CHAR_MAX : %d\n", CHAR_MAX);
printf("CHAR_MIN : %d\n", CHAR_MIN);
printf("INT_MAX : %d\n", INT_MAX);
printf("INT_MIN : %d\n", INT_MIN);
printf("LONG_MAX : %ld\n", (long) LONG_MAX);
printf("LONG_MIN : %ld\n", (long) LONG_MIN);
printf("SCHAR_MAX : %d\n", SCHAR_MAX);
printf("SCHAR_MIN : %d\n", SCHAR_MIN);
printf("SHRT_MAX : %d\n", SHRT_MAX);
printf("SHRT_MIN : %d\n", SHRT_MIN);
printf("UCHAR_MAX : %d\n", UCHAR_MAX);
printf("UINT_MAX : %u\n", (unsigned int) UINT_MAX);
printf("ULONG_MAX : %lu\n", (unsigned long) ULONG_MAX);
printf("USHRT_MAX : %d\n", (unsigned short) USHRT_MAX);
printf("FLT_MAX : %g\n", (float) FLT_MAX);
printf("FLT_MIN : %g\n", (float) FLT_MIN);
printf("-FLT_MAX : %g\n", (float) -FLT_MAX);
printf("-FLT_MIN : %g\n", (float) -FLT_MIN);
printf("DBL_MAX : %g\n", (double) DBL_MAX);
printf("DBL_MIN : %g\n", (double) DBL_MIN);
printf("-DBL_MAX : %g\n", (double) -DBL_MAX);
return (EXIT_SUCCESS);
}
Vous devrez peut-être modifier légèrement votre machine, mais c'est un bon modèle pour commencer à avoir une idée des valeurs min et max (définies par l'implémentation).
Il n'y a pas une réponse. La norme définit les plages minimales. Un int doit pouvoir contenir au moins 65535. Cependant, la plupart des compilateurs modernes permettent aux ints d'être des valeurs 32 bits. De plus, rien n'empêche plusieurs types d'avoir la même capacité (par exemple, int et long).
Cela étant dit, la norme indique dans votre cas particulier:
0 → +18446744073709551615
comme gamme pour unsigned long long int.
Pour en savoir plus: http://en.wikipedia.org/wiki/C_variable_types_and_declarations#Size
En C et C++, exigences de mémoire de certaines variables:
signed char: -2^07 to +2^07-1
short: -2^15 to +2^15-1
int: -2^15 to +2^15-1
long: -2^31 to +2^31-1
long long: -2^63 to +2^63-1
signed char: -2^07 to +2^07-1
short: -2^15 to +2^15-1
int: -2^31 to +2^31-1
long: -2^31 to +2^31-1
long long: -2^63 to +2^63-1
dépend du compilateur et de l'architecture du matériel
La norme internationale pour le langage C exige seulement que la taille des variables courtes soit inférieure ou égale à la taille du type int, qui à son tour doit être inférieure ou égale à la taille du type long.
En fait, la plupart des processeurs modernes non signés (ARM, Intel/AMD, Alpha, SPARC, Itanium, PowerPC) auront une plage allant de 0 à 2 ^ 32 - 1, ce qui correspond à 4 294 967 295 = 0xffffffff non signé) aura une longueur de 32 bits et le plus grand est celui indiqué.
(short non signé aura une valeur maximale de 2 ^ 16 - 1 = 65 535)
(unsigned) long long int aura une longueur de 64 bits (long int suffira sous la plupart des Linux 64 bits, etc., mais la norme promet 64 bits pour long long int) . Par conséquent, ceux-ci ont la plage 0 à 2 ^ 64 - 1 = 18446744073709551615
Examinez le fichier limits.h
de votre système, il indiquera les limites spécifiques du système. Ou cochez man limits.h
et allez à la section "Limites numériques".
Jetez un coup d'œil à limits.h . Vous pouvez trouver les valeurs spécifiques pour votre compilateur. INT_MIN et INT_MAX seront d'intérêt.
Un int non signé de 32 bits a une plage allant de 0 à 4 294 967 295. 0 à 65535 serait un 16 bits non signé.
Une longue longue non signée (et, sur une implémentation 64 bits, peut-être aussi ulong et éventuellement aussi bien) ont une plage64-1). En théorie, il pourrait être supérieur à cela, mais au moins pour le moment, c'est rare à inexistant.