Nombre de bits dans un type de données
J'ai deux tâches pour une mission, on renvoie le nombre de bits dans le type int sur n'importe quelle machine. J'ai pensé que je voudrais écrire ma fonction comme ceci:
int CountIntBitsF() {
int x = sizeof(int) / 8;
return x;
}
Ne fait que regarder à droite?
La deuxième partie consiste à retourner le nombre de bits de tout type de données, avec une macro, la macro peut être pris à partir de limites.h. J'ai regardé les limites.h sur ma machine, et aussi http://www.opengroup.org/onlinepubs/007908799/xsh/limits.h.html, mais je ne pense pas vraiment à comprendre comment une de celles-ci retourne le nombre de bits dans tout type de données. Toutes les pensées? Merci.
Question connexe: c - le Nombre de bits type de base de données.
OriginalL'auteur Crystal | 2010-01-19
Vous devez vous connecter pour publier un commentaire.
C'est
*
, pas/
.Comme pour la deuxième partie, voir les "Limites Numériques".
OriginalL'auteur Ignacio Vazquez-Abrams
L'unité fondamentale de stockage est un char. Il n'est pas toujours 8 bits de large. CHAR_BIT est défini dans les limites.h et a le nombre de bits dans un char.
OriginalL'auteur Justin Smith
Si vous souhaitez que le nombre de bits utilisés pour stocker un int en mémoire, utilisez la réponse de Justin,
sizeof(int)*CHAR_BIT
. Si vous voulez connaître le nombre de bits utilisés dans la valeur, de l'utilisation slebetman de réponse.Bien que pour obtenir les bits dans un INT, vous devriez probablement utiliser INT_MAX plutôt que UINT_MAX. Je ne me souviens pas si C99 assure de fait que
int
etunsigned int
sont de la même largeur, ou simplement qu'ils sont de la même taille de stockage. Je soupçonne seulement celle-ci, puisque dans 6.2.6.2 nous avons "si il y a des M valeur des bits dans le type signé et N pour un type non signé, alors M <= N", pas "M = N ou M = N-1".Dans la pratique, les types intégraux ne pas avoir de remplissage des bits de la mise en application que j'ai utilisé, de sorte que vous plus de chance d'obtenir la même réponse pour tous, +/- 1 pour le bit de signe.
unsigned
) qui utilise la même quantité de stockage (y compris le signe de l'information) et a les mêmes exigences alignement.Merci. Et note "de la même quantité de stockage", il ne dit pas "le même nombre de non-padding bits".
Pourquoi avons-nous besoin de connaître la différence entre un int en mémoire vs les bits utilisés dans la valeur. Est les bits utilisés dans la valeur la plus importante si vous faisiez une sorte de matériel de programmation où vous avez besoin de savoir le nombre de bits utilisés pour représenter certaines valeurs de registre ou quelque chose le long de ces lignes?
Oui, il y a de nombreuses raisons importantes pour des soins sur le bitwidth d'un int. Pour une chose, il détermine comment grand une valeur peut être stockée (c'est à dire, un document signé de 16 bits int pouvez stocker -32768..32767 tout en un entier non signé 16 bits int pouvez stocker 0..65535). Il est également important si vous avez besoin de sérialiser vos données, c'est à dire pour l'enregistrement dans un fichier ou la transmission à travers le réseau.
OriginalL'auteur Steve Jessop
Dans
limits.h
, UINT_MAX est la valeur maximale pour un objet de type unsigned int. Ce qui signifie que c'est un int avec tous les bits mis à 1. Donc, en comptant le nombre de bits dans un int:vous pensez peut-être concernant le passage des connecté valeurs. Pour les types non signés, le déplacement est bien défini.
Il faut rappeler que le code source est transformé en langage machine par des compilateurs, plutôt que par les documents de spécification.
techniquement ce n'est pas une extension de la norme, c'est juste une violation, et le compilateur dans ce mode n'est donc pas un compilateur C, c'est un compilateur d'une autre langue très voisine de C. dans le cas Contraire, Java est une "extension" de la norme C, en ajoutant et en supprimant les règles de C jusqu'à ce que vous vous retrouvez avec Java ;-). Une extension de la norme C est quand vous prenez quelque chose qui ne serait pas légal C, et de définir ce qu'il fait dans votre mise en œuvre. Il n'affecte pas l'effet juridique C.
int et unsigned int ont le même nombre de bits". Je ne trouve pas que dans la norme, savez-vous où il est? Quelles règles dois-je casser si dans mon de la mise en œuvre sizeof(unsigned int) == 4, UINT_MAX == 0xFFFFFFFF, sizeof(int) == 4, INT_MAX == 0x3FFFFFFF, et l'int a un peu de rembourrage pour aucune bonne raison que je peux penser à d'autres que lulz?
OriginalL'auteur slebetman
Avec g++ -O2 cette fonction évalue à une ligne constante:
sorties:
Généré X86 32 bits assember:
---SNIP---
---SNIP---
OriginalL'auteur Wojciech Migda
Êtes-vous sûr que vous voulez le nombre de bits, pas le nombre d'octets? En C, pour un type donné
T
, vous pouvez trouver le nombre d'octets qu'il faut à l'aide de lasizeof
de l'opérateur. Le nombre de bits dans un octet estCHAR_BIT
, qui est généralement de 8, mais peut être différent.Donc, étant donné un type
T
, le nombre de bits dans un objet de typeT
est:Noter que, sauf pour
unsigned char
type, toutes les combinaisons possibles denbits
bits ci-dessus ne représentent pas une valeur valide de typeT
.Pour la deuxième partie, notez que vous pouvez appliquer
sizeof
opérateur à un objet de type. En d'autres termes, étant donné un typeT
et un objetx
de ce type:Vous pouvez trouver la taille de T par
sizeof(T)
, et la taille dex
parsizeof x
. Les parenthèses sont facultatives sisizeof
est utilisé pour un objet.Compte tenu de l'information ci-dessus, vous devriez être en mesure de répondre à votre deuxième question. Demander à nouveau si vous avez encore des questions.
OriginalL'auteur Alok Singhal