Alternativas para digitar a conversão ao formatar o NS (U) Integer em arquiteturas de 32 e 64 bits?

Com a versão de 64 bits do iOS, não podemos usar%d e%u mais para formatarNSInteger eNSUInteger. Porque para 64 bits esses são typedef'd paralong eunsigned long ao invés deint eunsigned int.

Então, o Xcode lançará avisos se você tentar formatar o NSInteger com% d. O Xcode é bom para nós e oferece um substituto para esses dois casos, que consistem em um especificador de formato com prefixo l e um typecast longo. Então nosso código basicamente se parece com isso:

NSLog(@"%ld", (long)i);
NSLog(@"%lu", (unsigned long)u);

O que, se você me perguntar, é uma dor nos olhos.

Um par de dias atrás, alguém no Twitter mencionou os especificadores de formato%zd para formatar variáveis ​​assinadas e%tu para formatar variáveis ​​não assinadas em plataformas de 32 e 64 bits.

NSLog(@"%zd", i);
NSLog(@"%tu", u);

O que parece funcionar. E que eu gosto mais do que typecasting.

Mas honestamente não tenho ideia de por que isso funciona. Agora ambos são basicamente valores mágicos para mim.

Eu fiz um pouco de pesquisa e descobri que oz prefixo significa que o seguinte especificador de formato tem o mesmo tamanhosize_t. Mas eu não tenho absolutamente nenhuma idéia do que o prefixot significa. Então eu tenho duas perguntas:

O que exatamente%zd e%tu significar?

E é seguro usar%zd e%tu em vez de sugestão de maçãs para typecast a longo prazo?

Estou ciente de perguntas semelhantes e guias de transição de 64 bits de maçãs, que todos recomendam o%lu (unsigned long) abordagem. Eu estou pedindo uma alternativa para digitar o casting.

questionAnswers(3)

yourAnswerToTheQuestion