pregunta sobre especificadores de formato printf incompatibles
Pregunta
Estaba buscando printf en la página de manual y se me ocurrió algo.Me preguntaba si hay algún "abogado lingüístico" aquí que pueda responder una pregunta relativamente simple :-P.
Entonces el modificador 't' se define como
Una siguiente conversión entera corresponde a un argumento PTRDIFF_T.
Entonces que es supuesto ¿Qué sucederá si combinas esto con una conversión de entero sin signo?Claramente, o, u, x y X pretenden ser interpretados como valores sin signo, mientras que d e i están firmados.
Asimismo, existen versiones firmadas/sin firmar para todos los modificadores (int/unsigned int, size_t
/ ssize_t
, etc) excepto ptrdiff_t
.
En la práctica, no sucede nada malo ya que las versiones de tipos sin firmar ocupan la misma cantidad de espacio que las versiones firmadas.Entonces, los bytes correctos se eliminan de la pila.
Así que no sucede nada "malo", de hecho, imprime el valor esperado para todas las cosas probadas excepto "INT_MIN
" (asumiendo que sizeof(int) == sizeof(ptrdiff_t)
.
printf("%tu %td\n", INT_MIN, INT_MIN);
huellas dactilares
2147483648 -2147483648
en un sistema de 32 bits.
¿Tiene la norma alguna opinión al respecto?Me imagino que la respuesta será "comportamiento indefinido". Pero me imaginé que preguntaría ;).
Solución
No hay nada que ver aquí. El código que has escrito es legal.
A sólo algunos hechos de por qué:
- todos los tipos de enteros con signo tienen homólogos sin signo, con el mismo tamaño / requisitos de alineación
-
ptrdiff_t
se prescribe para ser un tipo entero con signo por la norma. Por lo tanto, tiene un gemelo sin signo. (De hecho, la lógica similar se aplica asize_t
así -ssize_t
no es C, pero POSIX) - el especificador de longitud
t
debe trabajar cond
,i
,o
,u
,x
, tiposX