Suponga que en una plataforma, el valor mínimo con signo es −2^15 = −32768 y el valor máximo es 2^15 −1 = 32767. La constante 32768 entonces no encaja en el
signedy, por lo tanto, tienesigned long. Como consecuencia, la expresión -32768 tiene el tiposigned long. Por lo tanto, el valor mínimo del tiposigneden dicha plataforma no se puede escribir como una constante literal.De Modern C de Jens Gustedt.
Es trivial entender por qué 32768 tiene signed long , pero ¿por qué -32768 también tiene una signed long y no está signed , dado el valor mínimo signed de -32768?
Porque -32768 es el literal positivo 32768 (que no cabe en un valor de 16 bits y, por lo tanto, debe representarse con el siguiente tipo más grande), al que se le aplica el menos unario (que no cambia el tipo).
Si escribe, por ejemplo ( ( - 32767 ) - 1 ), obtiene su constante en tipo int.
Si int es un tipo de 16 bits en su plataforma, entonces 32768 no encaja en ella. Por lo tanto, 32768 debe tener el siguiente tipo más grande que es long . -32768 no es un literal entero negativo sino un menos unario aplicado al literal 32768 . Dado que 32768 es long , también lo es -32768
Esto es exactamente lo mismo que
-32768 no es en realidad un literal entero. Es el literal entero 32768 con el operador - unario aplicado.
Como en este sistema el valor 32768 está fuera del rango de int , la constante 32768 tiene tipo long . Aplicar el unario - a un valor de tipo long da como resultado una expresión de tipo long , por lo tanto -32768 tiene tipo long .
Una forma de obtener el valor -32768 con el tipo int , la expresión adecuada sería -32767 - 1 . La constante entera 32767 tiene tipo int . Aplicar el operador unario - todavía nos da un valor en el rango de int , luego restar 1 nos da una expresión de tipo int con valor -32768.