C: ¿Qué carácter debería usarse para ptrdiff_t en printf?

¿Qué carácter debería usarse para ptrdiff_t en printf ?

¿El estándar C explica claramente cómo imprimir ptrdiff_t en printf ? No he encontrado a nadie.

 int a = 1; int b = 2; int* pa = &a; int* pb = &b; ptrdiff_t diff = b - a; printf("diff = %?", diff); // % what? 

Es %td . Mira aquí .

El borrador C11 explica el modificador de longitud para ptrdiff_t en 7.21.6.1 7 “La función fprintf

t
Especifica que el siguiente especificador de conversión d , i , o , u , x o X aplica a un ptrdiff_t o al correspondiente argumento de tipo entero sin signo; o que un especificador de conversión n siguiente se aplica a un puntero a un argumento ptrdiff_t .

Use "%td" como se muestra a continuación: Crédito: @trojanfoe

 ptrdiff_t diff = b - a; printf("diff = %td", diff); 

Si el comstackdor no admite "%td" , transfiéralo a un tipo firmado, cuanto más largo, mejor. Luego asegure el formato alternativo y la coincidencia de argumentos.

 // Note the cast printf("diff = %lld", (long long) diff); // or printf("diff = %ld", (long) diff); 

Especificadores de formato de referencia

Use %td y si su comstackdor no lo admite, intente %ld (también copie la entrada en long ).