Según los requisitos, utilizaría un campo de bits para ello.
struct int24{
unsigned int data : 24;
};
O, si una separación es más fácil, solo use 3 bytes (caracteres).
Por cierto, ambos casos de uso que mencionas en la pregunta generalmente usan enteros de 32 bits. En el caso del procesamiento de audio generalmente se convertirá a 32 bits (o flotantes, preferiblemente, para evitar situaciones de desbordamiento que obtendría con un punto fijo o matemáticas enteras) al cargar en fragmentos de audio porque no va a tener todo el archivo en la memoria a la vez.
Para datos de imagen, la gente tiende a usar enteros de 32 bits e ignorar los alfa 8 bits alfa en total, o si se trata de un formato compacto, es mejor que simplemente manipularlos como char-pointers de todos modos porque tendrás todos los canales separados. Va a ser una compensación de rendimiento/memoria de todos modos porque escribir un int es generalmente más rápido que tres caracteres por separado; sin embargo, llevará un 25% más de memoria.
Estructuras de embalaje como esta es específica del compilador. Sin embargo, en Visual Studio haría lo siguiente para hacer que la estructura sea exactamente de 24 bits.
#pragma pack(push, 1)
struct int24{
unsigned int data : 24;
};
#pragma pack(pop)
esto se ve muy bien, gracias. también tiene operadores de cambio de bit, ¡gran cosa! 1 pregunta: ¿cómo usar la clase para almacenar los datos en a, o para leer desde una secuencia? ¿sería posible usar el operador << and >> también? – OlimilOops
@Oops: Creo que no, ya que hay dos posibles conversiones implícitas de Int24 - para int y para flotar, y el compilador no tiene forma de elegir qué lanzamiento realizar, y luego usa el resultado con 'ostream :: operator << '. Pero puede agregar fácilmente operadores << and >> para ostreams y se distribuye usted mismo ... – conio
Como conio dice que si desea soporte de transmisión necesitará agregar las implementaciones usted mismo. Aunque no es particularmente difícil :) – Goz