2010-04-21 18 views
6

Entonces, ¿sabes cómo la primitiva de tipo char tiene el tamaño de 1 byte? ¿Cómo podría hacer una primitiva con un tamaño personalizado? Así que, como en lugar de un int en el tamaño de 4 bytes, hago uno con el tamaño de digamos 16. ¿Hay alguna manera de hacer esto? ¿Hay alguna forma de evitarlo?¿Tamaño de bytes personalizado?

+1

¿Qué quieres lograr con esto? ¿Es para permitir números más grandes en sus cálculos o tiene otro plan para sus enteros grandes de 16 bytes? – Laserallan

+1

Esta es una pregunta interesante, pero poco especificada. Y las respuestas no abordan la creación de primitivas más grandes o más pequeñas. Más pequeño que un 'char': anular' operador & 'como en' std :: vector :: iterator'. Más grande que un 'long int': use una biblioteca bignum. – Potatoswatter

+0

@Laserallan Quiero usar esto para matemáticas con primitivas en C++ que los números salen del rango de las primitivas estándar en C++. –

Respuesta

5

Normalmente, creará una estructura que represente los datos que le interesan. Si se trata de 16 bytes de datos, ya sea un conjunto de varios tipos más pequeños o está trabajando en un procesador que tiene un tipo integral nativo de 16 bytes.

Si intenta representar números extremadamente grandes, es posible que necesite encontrar una biblioteca especial que maneje números de tamaño arbitrario.

4

Depende de por qué lo hace. Por lo general, no puede usar tipos de menos de 8 bits, porque esa es la unidad direccionable para la arquitectura. Puede utilizar estructuras, sin embargo, para definir diferentes longitudes:

struct s { 
    unsigned int a : 4; // a is 4 bits 
    unsigned int b : 4; // b is 4 bits 
    unsigned int c : 16; // c is 16 bits 
}; 

Sin embargo, no hay garantía de que la estructura será de 24 bits de longitud. Además, esto puede causar problemas endian. Donde pueda, lo mejor es usar tipos independientes del sistema, como uint16_t, etc. También puede usar operadores bit a bit y cambios de bit para mezclar las cosas muy específicamente.

+0

uint16_t todavía tiene problemas de endian. –

+0

@Billy cierto ... Creo que mi punto es que los bitfields en las estructuras son muy complicados en este sentido, y ese es uno de sus principales usos. – WhirlWind

+0

Sí. No iba a rechazarte por eso. Pero pensé que valía la pena mencionarlo. –

0

Si quiere hacer un tipo nuevo, digitelo. Si desea que tenga un tamaño de 16 bytes, escribadef una estructura que contenga 16 bytes de datos de miembros. Solo ten en cuenta que con frecuencia los compiladores rellenarán contigo cosas para que coincidan con las necesidades de alineación de tu sistema. Una estructura de 1 byte raramente permanece 1 byte sin cuidado.

1

En C++ 11, hay una excelente solución para esto: std :: aligned_storage.

#include <memory> 
#include <type_traits> 

int main() 
{ 
    typedef typename std::aligned_storage<sizeof(int)>::type memory_type; 
    memory_type i; 
    reinterpret_cast<int&>(i) = 5; 
    std::cout << reinterpret_cast<int&>(i) << std::endl; 

    return 0; 
} 

Le permite declarar un bloque de almacenamiento no inicializado en la pila.

+0

¿Cuál es el vínculo con la pregunta? –

+0

@ J.N. Además del hecho obvio de que permitirte asignar almacenamiento de tamaño personalizado en la pila o en el montón te permite definir clases personalizadas de un lado dado usando los métodos correctos. Puede no comportarse como una primitiva, pero si necesita una clase de tamaño personalizado, esta es una gran herramienta para usar (incluso como un entero de ancho personalizado). Es mucho mejor que definir un estricto personalizado con miembros de datos arbitrarios. –

Cuestiones relacionadas