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

.
Foi útil?

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 a size_t bem - ssize_t não é C, mas POSIX)
  • o especificador comprimento t deve trabalhar com d, i, o, u, x, tipos X
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top