Programa simple que hice cuando estaba experimentando con inttypes.h:
#include <stdio.h> #include <stdbool.h> #include <inttypes.h> bool get_bit(uint32_t x, uint8_t n) { x >>= n; return x & 1; } int main() { uint32_t x; uint8_t n; printf ("Enter x: "); scanf("%"SCNu32, &x); printf ("Enter n: "); scanf("%"SCNu8, &n); printf("The %"PRIu8"th bit of %"PRIu32" is: %d", n, x, get_bit(x, n)); return 0; }En mi teléfono (64 bit octa core ARN LTE Soc Android 10) funciona bien:
Enter x: 1 Enter n: 0 The 0th bit of 1 is: 1Pero en mi computadora (64 bit x86 Windows 10) obtengo:
Enter x: 1 Enter n: 0 The 0th bit of 0 is: 0Cambiar bool a uint8_t no lo afecta.
EDITAR: Intenté compilar con MinGW-w64 GCC C99 y C17.
Parece que puede tener este problema en caso de que esté usando un compilador de Windows que use la biblioteca CRT (no) estándar no compatible de Microsoft. Es decir: Visual Studio o Mingw64/gcc.
Puedo reproducirlo en Mingw/gcc. Es un problema bien conocido que Microsoft CRT no funciona y, por ejemplo, no es compatible con varios especificadores de formato introducidos en C99. Parecería que el problema radica en la lectura de scanf con el especificador de formato incorrecto, porque al compilar con todas las advertencias habilitadas, obtengo:
advertencia: carácter de tipo de conversión desconocido 'h' en formato [-Wformat=]
%hh es lo que se encuentra debajo del capó de SCNu8 pero el compilador solo lee hasta %h y se detiene allí. La llamada scanf realmente falla.
Puede descifrar la biblioteca CRT al menos en Mingw usando lo siguiente:
#define __USE_MINGW_ANSI_STDIO 1 #include <stdio.h> Cuando agregué lo anterior a su código, obtengo The 0th bit of 1 is: 1 .
Sin el parche anterior, obtengo The 0th bit of 0 is: 0