¿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).