¿El tipo predeterminado de la constante de enteros está firmado o sin firmar?

¿El tipo predeterminado de la constante de enteros está firmado o sin firmar? como 0x80000000, ¿cómo puedo decidir usarlo como una constante de entero con signo o como constante de entero sin signo sin ningún sufijo?

Si es una constante entera con signo, ¿cómo explicar el siguiente caso?

printf("0x80000000>>3 : %x\n", 0x80000000>>3); 

salida:

 0x80000000>>3 : 10000000 

El caso siguiente puede indicar que mi plataforma utiliza un cambio aritmético en modo de bits, no un cambio lógico en modo de bits:

 int n = 0x80000000; printf("n>>3: %x\n", n>>3); 

salida:

 n>>3: f0000000 

C tiene diferentes reglas para constantes decimales, octales y hexadecimales.

Para decimal, es el primer tipo en el que puede caber el valor: int , long , long long

Para hexadecimal, es el primer tipo en el que puede caber el valor: int , unsigned int , long , unsigned long , long long , unsigned long long

Por ejemplo, en un sistema con int 32-bit y unsigned int : 0x80000000 es unsigned int .

Tenga en cuenta que para las constantes decimales, C90 tenía reglas diferentes (pero las reglas no cambiaron para las constantes hexadecimales).

Se firma si encaja en un entero con signo . Para que no esté firmado, agregue un sufijo u , por ejemplo, 1234u .

Puede convertir un valor firmado en unsigned asignándolo a una variable unsigned.

 unsigned int i = 1234u; // no conversion needed unsigned int i = 1234; // signed value 1234 now converted to unsigned 

Para 0x80000000 , no se 0x80000000 si los ints son de 32 bits en su plataforma, ya que no encaja en un int firmado.


Otra cosa a tener en cuenta, sin embargo, es que el comportamiento del cambio a la derecha depende de la plataforma. En algunas plataformas es preservativo de signos (aritmética) y en algunas plataformas es un simple cambio de bit a bit (lógico).