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 ??
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.)
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.