2012-08-08 20 views
15

Simplemente coloque C y variantes (a diferencia de wuss java con su máquina virtual) el tamaño de los tipos primitivos en diferentes objetivos puede variar mucho, y realmente no hay garantía a menos que use los tipos de ancho fijo definidos en stdint.h, e incluso entonces su implementación tiene que apoyarlos.¿sizeof devuelve la cantidad de bytes o el número de octetos de un tipo en C?

De todos modos hipotéticamente (porque en la mayoría de las máquinas modernas de un byte es un octeto, para tareas de red que asumen (ASCII)) no sizeof devolver el tamaño de un tipo de datos en bytes o en octetos?

+3

bytes, pero un solo byte (representado como 'char') tiene' bits de CHAR_BITS'. Si quieres el número de octetos en una 'T', haz' sizeof (T) * CHAR_BITS/8'. En la mayoría de las plataformas, 'CHAR_BITS' es' 8'. – GManNickG

+2

@GManNickG 'CHAR_BIT' (no hay S) :) – Praetorian

+0

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

Respuesta

16

Respuesta: sizeof devuelve el tamaño del tipo en el bytes.


Ejemplo: sizeof(char) es 100% garantizado para ser 1, pero esto no quiere decir, que se trata de un octeto (8 bits).


demostrado por el estándar:

en 6.5.3.4, punto 2:

El operador sizeof produce el tamaño (en bytes) de su operando, que puede ser una expresión o el nombre entre paréntesis de un tipo. El tamaño se determina a partir del tipo del operando. El resultado es un entero. Si el tipo del operando es una matriz de longitud variable tipo , se evalúa el operando; de lo contrario, el operando no se evalúa y el resultado es una constante entera .

...

Cuando se aplica a un operando que tiene tipo char, unsigned char, o signed char, (o una versión cualificada de la misma) el resultado es 1. Cuando se aplica a un operando que tiene el tipo matriz , el resultado es el número total de bytes en la matriz) Cuando se aplica a un operando que tiene estructura o tipo de unión, el resultado es el número total de bytes en tal objeto, incluyendo relleno interno y posterior.

Además, en la Sección 3.6, punto 3:

Un byte se compone de una secuencia contigua de bits, el número de los cuales es definido por la implementación

+0

Muy completo, gracias. – awiebe

4

sizeof siempre devuelve el tamaño como el número de bytes. Pero de acuerdo con wikipedia:

En los lenguajes de programación C y C++, el sizeof operador unitario se utiliza para calcular el tamaño de cualquier tipo de datos, medido en el número de bytes necesarios para representar el tipo. Un byte en este contexto es el mismo que un carácter sin signo, y puede tener más de 8 bits, aunque es poco común.

6

sizeof da el tamaño en bytesSin embargo, tenga en cuenta que "byte" es un término técnico en el estándar C, y se define de manera que sizeof(char) == 1.

1

Desde mi propia experiencia, trabajando en microcontroladores embebidos con exóticos compiladores 'C', he visto:

sizeof(uint8) 

retorno 1

sizeof(uint16) 

retorno 1

sizeof(uint32) 

volver 2

Claramente, yo estaba tratando con una máquina a que la entidad direccionable más pequeño era de 16 bits, por lo que el sizeof no cumple con C89 o C99.

diría que en la corriente principal C89 C99 & sistemas compatibles, la respuesta aceptada es correcta. Por desgracia, un compilador de "C" todavía puede ser llamado un compilador de "C", incluso si no cumple con un estándar de 25 años de edad. Espero que esta respuesta ayude a poner las cosas en perspectiva, dados los sistemas más exóticos.

Cuestiones relacionadas