pergunta sobre especificadores de formato printf incompatíveis
Pergunta
Eu estava olhando através da página de manual para printf e algo me ocorreu. Eu queria saber se há algum "advogados de linguagem" aqui, que poderia responder a uma :-P questão relativamente simples.
Assim, o 't' modificador é definido como
A conversão seguinte número inteiro corresponde a um argumento ptrdiff_t.
Então, o que é deveria para acontecer se você combinar isso com uma conversão inteiro sem sinal? Claramente o, u, X e X, toda, toda a intenção de ser interpretadas como valores não assinados, enquanto d e i são assinados.
Do mesmo modo, não são assinados / versões sem sinal para todos os modificadores (int / unsigned int, size_t
/ ssize_t
, etc), excepto ptrdiff_t
.
Na prática, nada de ruim acontece desde versões não assinados de tipos de ocupar o mesmo espaço que as versões assinadas. Assim, o direito sobre de bytes se retirado da pilha.
Portanto, nada "ruim" acontece, de fato, em imprime o valor esperado para todas as coisas testados, exceto o "INT_MIN
" (assumindo que sizeof(int) == sizeof(ptrdiff_t)
.
printf("%tu %td\n", INT_MIN, INT_MIN);
impressões
2147483648 -2147483648
em um sistema de 32 bits.
A Norma tem alguma opinião sobre isso? Eu acho que a resposta será "um comportamento indefinido." Mas eu percebi que eu perguntar;)
.Solução
Nada a ver aqui. O código que você escreveu é legal.
Apenas alguns fatos a respeito de porque:
- todos os tipos inteiros assinados têm contrapartidas não assinados, com o mesmo tamanho / requisitos de alinhamento
-
ptrdiff_t
é prescrito para ser um tipo inteiro assinado pela norma. Portanto, ele tem um gêmeo não assinado. (Na verdade, a lógica semelhante aplica-se asize_t
bem -ssize_t
não é C, mas POSIX) - o especificador comprimento
t
deve trabalhar comd
,i
,o
,u
,x
, tiposX