Para un transporte puede usar:
limits.h
#define LNG_BIT (sizeof(long) * CHAR_BIT)
unsigned long num = 1UL << (LNG_BIT - 1);
Para conseguir "baja int", algo así como ?:
#define INT_BIT (sizeof(int) * CHAR_BIT)
if (LNG_BIT > INT_BIT)
return num & (~0UL >> INT_BIT);
else
return num;
o
num &= ~(~0U << INT_BIT);
O, la máscara de uso, Depende en gran medida de por qué, para qué, etc. los bits int.
También tenga en cuenta las opciones dadas por los compiladores; Es decir. Si se está empleando gcc:
-m32
-m64
-mx32
generar código de 32 bits o Entorno de 64 bits.
* La opción -m32 establece los tipos int, long y pointer en 32 bits y genera código que se ejecuta en cualquier sistema i386.
* La opción -m64 establece int a 32 bits y long y tipos de puntero a 64 bits, y genera código para la arquitectura x86-64. Para Darwin solo la opción -m64 también desactiva las opciones -fno-pic y -mdinámica-no-pic.
* La opción -mx32 establece los tipos int, long y pointer en 32 bits y genera código para la arquitectura x86-64.
También hay -maddress-mode=long
etc.
-maddress-mode = larga
Generar código para el modo de dirección larga. Esto solo es compatible con entornos de 64 bits y x32. Es el modo de dirección predeterminado para entornos de 64 bits.
Probar: 'unsigned long num = 1UL << 63;' – Mysticial
@Mysticial Por qué no publicar que como una respuesta junto con el material de promoción número entero? – cnicutar
Depende de qué compilador se use. Muchos compiladores heredados tendrían valores predeterminados de 32 bits, incluso si se ejecutan en una máquina de 64 bits. Confirma que 'sizeof num' es 8 antes de intentar algo más. – wallyk