Estaba buscando en la página de manual de printf y se me ocurrió algo. Me preguntaba si hay algún "abogado de idiomas" aquí que pueda responder a una pregunta relativamente simple :-P.pregunta acerca de los especificadores de formato de impresión incompatibles
Así que el modificador 't' se define como
La siguiente conversión entera corresponde a un argumento ptrdiff_t.
Entonces, ¿qué es supone que suceda si se combina esto con una conversión de entero sin signo? Está claro que o, u, xy X son todos interpretados como valores sin signo, mientras que d e i están firmados. También hay versiones con y sin firma para todos los modificadores (int/unsigned int, size_t
/ssize_t
, etc.) excepto ptrdiff_t
.
En la práctica, no pasa nada malo ya que las versiones sin firmar de los tipos ocupan la misma cantidad de espacio que las versiones firmadas. Así que la derecha de bytes se saca de la pila.
Así que nada "malo" que ocurre, de hecho, en grabados el valor esperado para todas las cosas probadas, excepto el "INT_MIN
" (suponiendo que sizeof(int) == sizeof(ptrdiff_t)
.
printf("%tu %td\n", INT_MIN, INT_MIN);
impresiones
2147483648 -2147483648
en una Sistema de 32 bits
¿La norma tiene alguna opinión al respecto? Me imagino que la respuesta será "comportamiento indefinido". Pero pensé en preguntar;).
¿Tiene esto ¿Tiene algo que ver con C++ (al menos antes de C++ 0x)? ¿Se va a cambiar printf() etc. en C++ 0x para cumplir con C99? Creo que deberías eliminar la etiqueta C++. –
ptrdiff_t se define en cstddef en C++. printf obviamente también existe en C++. No estoy al tanto de C++ 0x cambiando printf en absoluto. –
hrmm, parece que C++ puede no tener el modificador c99 't'. Lo suficientemente justo. –