2014-04-03 16 views
6
base di

Il codice utilizza tipi di dati come uint8 [1 byte vasta interi senza segno], uint16 [2 byte vasta interi senza segno], uint32 [4 byte vasta interi senza segno] eccdi uint8, uint16 e uint32?

domanda: uint8 è stessa char? ? uint16 è uguale a int ?? uint32 è uguale a lungo ?? uint64 è uguale a doppio ??

per esempio: uint8 c [20]; // then the sizeof (c) dovrebbe essere 20- Isnt ?? Ho scritto un piccolo codice in Visual Studio come illustrato di seguito:

#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; 
} 

ma la dimensione del c in modalità di debug è 50. Perché è mostrando così ??

+0

dovrebbe essere 'typedef uint8 char unsigned;', uso uint8_t, uint16_t, uint32_t in . – BLUEPIXY

+3

'sizeof c' è 50? Dovrebbe essere '20 * sizeof (unsigned int)' che non può essere 50. – ajay

+0

come convertire l'int in char per ottenere la soluzione finale in char ?? – user3458454

risposta

3

E 'abbastanza chiaro come si sta calcolando la dimensione ("le dimensioni in modalità debug" "?)

Uso printf():.

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

Normalmente ci si stampare un valore size_t (che è il tipo sizeof rendimenti) con %zu, ma se si sta utilizzando un compilatore pre-C99 come Visual Studio che non funzionano.

Hai bisogno di trovare le dichiarazioni typedef nel codice che definisce i nomi personalizzati come uint8 e così via; quelli non sono standard quindi nessuno qui può sapere come sono definiti nel tuo codice.

Il nuovo codice C deve utilizzare <stdint.h> che fornisce uint8_t e così via.

+0

Per ottenere il valore di c allora cosa dovrei fare ?? infine voglio memorizzare il valore nella c [3]; – user3458454

9

uint8, uint16, uint32 e uint64 sono probabilmente tipi specifici di Microsoft.

A partire dalla serie 1999, C supporta typedef standard con significati simili, definite in <stdint.h>: uint8_t, uint16_t, uint32_t e uint64_t. Suppongo che i tipi specifici di Microsoft siano definiti in modo simile. Microsoft supporta <stdint.h>, almeno a partire da Visual Studio 2010, ma il codice precedente potrebbe utilizzare uint8 e altri.

I tipi predefiniti char, short, int e altri hanno dimensioni che variano da un'implementazione C a un'altra. Lo standard C ha determinati requisiti minimi (char è almeno 8 bit, short e sono almeno 16, long è almeno 32 e ogni tipo in quell'elenco è largo almeno come il tipo precedente), ma consente un po 'di flessibilità. Ad esempio, ho visto sistemi in cui lo int è 16, 32 o 64 bit.

char è quasi sempre esattamente 8 bit, ma è consentito essere più ampio. E semplice char può essere firmato o non firmato.

uint8_t è necessario essere un tipo intero senza segno con esattamente 8 bit di larghezza.È probabile che sia un typedef per unsigned char, anche se potrebbe essere un typedef per plain char se plain char risulta non firmato. Se non è presente un tipo predefinito di 8 bit senza segno, allora non sarà definito uint8_t.

Analogamente, ogni tipo di uintN_t è un tipo senza segno con esattamente N bit di larghezza.

Inoltre, <stdint.h> definisce corrispondente firmati intN_t tipi, nonché int_fastN_t e int_leastN_t tipi che sono almeno larghezza specificata.

I tipi [u]intN_t non hanno bit di riempimento, quindi la dimensione di ciascuno è esattamente N bit. I tipi firmati intN_t sono necessari per utilizzare una rappresentazione a complemento a 2.

Anche se uint32_t potrebbe essere lo stesso di unsigned int, per esempio, non deve presumere che. Utilizzare unsigned int quando è necessario un tipo intero senza segno con almeno 16 bit di larghezza e questa è la dimensione "naturale" per il sistema corrente. Utilizzare uint32_t quando è necessario un tipo intero senza segno con esattamente 32 bit di larghezza.

(E no, uint64 o uint64_t non è la stessa come double; double è un tipo in virgola mobile.)

+1

Il downsoter dovrebbe fare commenti? –

Problemi correlati