Extendí la buena respuesta dada por @ renato-chandelier asegurando el apoyo de:
_NIBBLE_(…)
- 4 bits, 1 mordisco como argumento
_BYTE_(…)
- 8 bits, 2 mordiscos como argumentos
_SLAB_(…)
- 12 bits, 3 mordiscos como argumentos
_WORD_(…)
- 16 bits, 4 mordiscos como argumentos
_QUINTIBBLE_(…)
- 20 bits, 5 mordiscos como argumentos
_DSLAB_(…)
- 24 bits, 6 mordiscos como argumentos
_SEPTIBBLE_(…)
- 28 bits, 7 mordiscos como argumentos
_DWORD_(…)
- 32 bits, 8 mordiscos como argumentos
En realidad, no estoy tan seguro acerca de los términos "quintibble" y "septibble". Si alguien conoce alguna alternativa, hágamelo saber.
Aquí está la macro reescrita:
#define __CAT__(A, B) A##B
#define _CAT_(A, B) __CAT__(A, B)
#define __HEX_0000 0
#define __HEX_0001 1
#define __HEX_0010 2
#define __HEX_0011 3
#define __HEX_0100 4
#define __HEX_0101 5
#define __HEX_0110 6
#define __HEX_0111 7
#define __HEX_1000 8
#define __HEX_1001 9
#define __HEX_1010 a
#define __HEX_1011 b
#define __HEX_1100 c
#define __HEX_1101 d
#define __HEX_1110 e
#define __HEX_1111 f
#define _NIBBLE_(N1) _CAT_(0x, _CAT_(__HEX_, N1))
#define _BYTE_(N1, N2) _CAT_(_NIBBLE_(N1), _CAT_(__HEX_, N2))
#define _SLAB_(N1, N2, N3) _CAT_(_BYTE_(N1, N2), _CAT_(__HEX_, N3))
#define _WORD_(N1, N2, N3, N4) _CAT_(_SLAB_(N1, N2, N3), _CAT_(__HEX_, N4))
#define _QUINTIBBLE_(N1, N2, N3, N4, N5) _CAT_(_WORD_(N1, N2, N3, N4), _CAT_(__HEX_, N5))
#define _DSLAB_(N1, N2, N3, N4, N5, N6) _CAT_(_QUINTIBBLE_(N1, N2, N3, N4, N5), _CAT_(__HEX_, N6))
#define _SEPTIBBLE_(N1, N2, N3, N4, N5, N6, N7) _CAT_(_DSLAB_(N1, N2, N3, N4, N5, N6), _CAT_(__HEX_, N7))
#define _DWORD_(N1, N2, N3, N4, N5, N6, N7, N8) _CAT_(_SEPTIBBLE_(N1, N2, N3, N4, N5, N6, N7), _CAT_(__HEX_, N8))
Y aquí está el ejemplo de Renato:
char b = _BYTE_(0100, 0001); /* equivalent to b = 65; or b = 'A'; or b = 0x41; */
unsigned int w = _WORD_(1101, 1111, 0100, 0011); /* equivalent to w = 57155; or w = 0xdf43; */
unsigned long int dw = _DWORD_(1101, 1111, 0100, 0011, 1111, 1101, 0010, 1000); /* Equivalent to dw = 3745774888; or dw = 0xdf43fd28; */
00010000
es octal, ¿verdad? (Y a su declaración le falta un tipo.)