web-dev-qa-db-fra.com

taille de uint8, uint16 et uint32?

La base de code utilise des types de données comme uint8 [entier non signé large de 1 octet], uint16 [entier non signé large de 2 octets], uint32 [entier non signé large de 4 octets] etc.

question: uint8 est le même que char ?? uint16 est identique à int ?? uint32 est le même aussi longtemps ?? uint64 est le même que double ??

par exemple: uint8 c [20]; // alors la taille de (c) devrait être 20- N'est-ce pas ?? J'ai écrit un petit code dans Visual Studio comme indiqué ci-dessous:

#include <stdio.h>
#include <string.h>
typedef unsigned int uint32;
typedef unsigned int uint8;
int main()
{
    double a = 1320.134;
    uint32 b;
    uint8 c[20];
     b = (unsigned int)a;
    c[3] = b;
    printf("value is %d", c[3]);
    return 1;
}

mais la taille de c en mode débogage est de 50. Pourquoi est-il affiché comme ça ??

11
user3458454

uint8, uint16, uint32 Et uint64 Sont probablement des types spécifiques à Microsoft.

Depuis la norme de 1999, C prend en charge les caractères typographiques standard ayant des significations similaires, définies dans <stdint.h>: uint8_t, uint16_t, uint32_t Et uint64_t. Je suppose que les types spécifiques à Microsoft sont définis de manière similaire. Microsoft prend en charge <stdint.h>, Au moins à partir de Visual Studio 2010, mais un code plus ancien peut utiliser uint8 Et al.

Les types prédéfinis char, short, int et al ont des tailles qui varient d'une implémentation C à l'autre. La norme C a certaines exigences minimales (char est au moins 8 bits, short et int sont au moins 16, long est au moins 32, et chaque type de cette liste est au moins aussi large que le type précédent), mais permet une certaine flexibilité. Par exemple, j'ai vu des systèmes où int est 16, 32 ou 64 bits.

char est presque toujours exactement 8 bits, mais il est autorisé à être plus large. Et le simple char peut être signé ou non signé.

uint8_t Doit être un type entier non signé qui fait exactement 8 bits de large. Il s'agit probablement d'un typedef pour unsigned char, Bien qu'il puisse s'agir d'un typedef pour plain char si plain char n'est pas signé. S'il n'y a pas de type non signé 8 bits prédéfini, uint8_t Ne sera pas défini du tout.

De même, chaque type uintN_t Est un type non signé qui fait exactement N bits de large.

De plus, <stdint.h> Définit les types intN_t Signés correspondants, ainsi que les types int_fastN_t Et int_leastN_t Qui sont au moins le type spécifié largeur.

Les types [u]intN_t Sont garantis sans bits de remplissage, donc la taille de chacun est exactement N bits. Les types intN_t Signés sont requis pour utiliser une représentation en complément à 2.

Bien que uint32_t Puisse être identique à unsigned int, Par exemple, vous ne devriez pas supposer cela. Utilisez unsigned int Lorsque vous avez besoin d'un type d'entier non signé d'au moins 16 bits de large, et c'est la taille "naturelle" du système actuel. Utilisez uint32_t Lorsque vous avez besoin d'un type entier non signé qui fait exactement 32 bits de large.

(Et non, uint64 Ou uint64_t N'est pas identique à double; double est un type à virgule flottante.)

16
Keith Thompson

On ne sait pas trop comment vous calculez la taille ("la taille en mode débogage"? ").

Utilisez printf():

printf("the size of c is %u\n", (unsigned int) sizeof c);

Normalement, vous imprimez un size_t valeur (qui est le type sizeof renvoie) avec %zu, mais si vous utilisez un compilateur pré-C99 comme Visual Studio qui ne fonctionnera pas.

Vous devez trouver les instructions typedef dans votre code qui définissent les noms personnalisés comme uint8 etc; ce ne sont pas standard, donc personne ici ne peut savoir comment ils sont définis dans votre code.

Le nouveau code C doit utiliser <stdint.h> ce qui vous donne uint8_t etc.

3
unwind