Hasta donde yo se un numero por decir uno el "24" en un int de 8, 16, 24, 32 y 64 SIEMPRE tendran los mismos bits encendidos.
Prueba estas funciones que te arme
typedef int INT32; // Entero de 4 bytes...
typedef int INT24; // Deberian ser 3 bytes... de manera auxiliar pongo un int de 4 bytes...
INT32 int24To32(INT24 i24)
{
INT32 i32Ret = (0x7fffff & i24); // Esta mascara la implemente por que ahorita en este codigo INT24 es de 32 bits (la estoy emulando).
return (i24 & 0x800000) ? (0x800000 | i24) : i24;
}
INT24 int32To24(INT32 i32)
{
INT24 i24Ret = (0x7fffff & i32); // Esta mascara es para obtener los 3 bytes menos significativos que corresponden a un entero de 24 bits.
// la "e" es para ignorar el bit que se supone es para el bit de signo (el que corresponde) para el entero de 24 bits... en este caso
// omitimos este y lo dejamos en 0, y verificamos si el bit de signo del entero de 32 esta encendido para encenderlo en el entero de 24 bits.
return (i32 & 0x80000000) ? (0x800000 | i32) : i32;
}
Edito:
Aclaración: las funciones son para Dezplazar el signo y poner en donde corresponde el bit de signo... en tal caso que no quieras desplazarlo solo debes aplicar mascaras:
entero24 = 0xffffff & entero32;
entero32 = entero24;
Dulces Lunas!¡.