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

¿Fue útil?

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 a size_t así - ssize_t no es C, pero POSIX)
  • el especificador de longitud t debe trabajar con d, i, o, u, x, tipos X
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top