2012-08-08 10 views
15

Semplicemente inserito in C e varianti (diversamente da wuss java con la sua macchina virtuale) la dimensione dei tipi primitivi su diversi target può variare notevolmente, e non c'è davvero alcuna garanzia a meno che non si utilizzino i tipi di larghezza fissa definiti in stdint.h, e anche allora la tua implementazione deve supportarli.Does sizeof restituisce il numero di byte o il numero di ottetti di un tipo in C?

In ogni caso ipoteticamente (poiché sulla maggior parte delle macchine moderne un byte è un ottetto, per scopi di rete presumo (ASCII)) sizeof restituisce la dimensione di un tipo di dati in byte o in ottetti?

+3

Byte, ma un singolo byte (rappresentato come 'char') ha bit' CHAR_BITS'. Se vuoi il numero di ottetti in un 'T', esegui' sizeof (T) * CHAR_BITS/8'. Sulla maggior parte delle piattaforme, 'CHAR_BITS' è' 8'. – GManNickG

+2

@GManNickG 'CHAR_BIT' (non c'è S) :) – Praetorian

+0

float octetPercent = sizeof (T) * CHAR_BIT /8.0; – awiebe

risposta

16

Risposta: sizeof restituisce la dimensione del tipo in byte .


Esempio: sizeof(char) è garantita 1 100%, ma questo non significa, che è un ottetto (8 bit).


Dimostrato dalla norma:

in 6.5.3.4, punto 2:

L'operatore sizeof cede la dimensione (in byte) del suo operando, che può essere un espressione o il nome tra parentesi di un tipo. La dimensione è determinata dal tipo di dell'operando. Il risultato è un numero intero. Se il tipo di operando è un tipo a lunghezza variabile , l'operando viene valutato; in caso contrario, l'operando non viene valutato e il risultato è una costante intera di .

...

Quando applicato ad un operando che è di tipo char, unsigned char o signed char, (o una versione quali fi cata di esso) il risultato è 1. Se applicato a un operando con un tipo di array , il risultato è il numero totale di byte nell'array) Se applicato a un operando con struttura o tipo di unione, il risultato è il numero totale di byte in tale oggetto, compresa imbottitura interna e finale.

Inoltre, nella sezione 3.6, punto 3:

Un byte è composto da una sequenza contigua di bit, il cui numero dipende dall'implementazione

+0

Molto approfondito, grazie. – awiebe

4

sizeof restituisce sempre la dimensione come numero di byte. Ma secondo wikipedia:

Nei linguaggi di programmazione C e C++, l'operatore sizeof unario viene utilizzato per calcolare la dimensione di qualsiasi tipo di dati, misurata in numero di byte necessari per rappresentare il tipo. Un byte in questo contesto è lo stesso di un char unsigned, e può essere maggiore di 8 bit, anche se non è comune.

6

sizeof dà la dimensione in byte.Tuttavia, si noti che "byte" è un termine tecnico nello standard C ed è definito in modo tale che sizeof(char) == 1.

1

Dalla mia esperienza, lavorando su microcontrollori embedded con esotiche compilatori 'C', ho visto:

sizeof(uint8) 

ritorno 1

sizeof(uint16) 

ritorno 1

sizeof(uint32) 

ritorno 2

Chiaramente, avevo a che fare con una macchina dove la più piccola entità indirizzabile era a 16 bit, quindi la sizeof non è conforme a C89 o C99.

Direi che sui sistemi compatibili C99 & C99, la risposta accettata è corretta. Sfortunatamente, un compilatore "C" può ancora essere chiamato un compilatore "C", anche se non è conforme a uno standard di 25 anni. Spero che questa risposta aiuti a mettere le cose in prospettiva, dati i sistemi più esotici.

Problemi correlati