2017-09-12 8 views
3

Pourquoi ne pouvons-nous pas mettre en forme la chaîne en utilisant "% zd" comme prévu dans les périphériques 32 bits (iPhone5, iPhone4s ou leurs simulateurs)?"NSString stringWithFormat:" avec comportement curieux "% zd" dans les périphériques 32 bits

int64_t test1 = 11111111; 
int64_t test2 = 22222222; 
int64_t test3 = 33333333; 
int64_t test4 = 44444444; 
NSString *testStr = [NSString stringWithFormat:@"\"%zd %zd %zd %zd\"", test1, test2, test3, test4]; 
NSLog(@"testStr: %@", testStr); 

NSInteger test5 = 55555555; 
NSInteger test6 = 66666666; 
NSInteger test7 = 77777777; 
NSInteger test8 = 88888888; 
testStr = [NSString stringWithFormat:@"\"%zd %zd %zd %zd\"", test5, test6, test7, test8]; 
NSLog(@"testStr: %@", testStr); 

Le journal est:

2017-09-12 05:53:59.462: testStr:"11111111 0 22222222 0" 
2017-09-12 05:53:59.465: testStr:"55555555 66666666 77777777 88888888" 

Répondre

3

Note: réponse juste tapé sur une tablette, votre échantillon non testé, donc c'est une supposition.

Le format %zd correspond aux valeurs de type size_t et non aux valeurs 64 bits.

Essayez d'utiliser %lld pour int64_t valeurs, long long est 64 bits sur les versions iOS 32 bits et 64 bits.

Pour NSInteger essayer %ld et définissaient les arguments à long, c'est parce que la taille de NSInteger dépend de la plate-forme.

HTH

+0

Pensez à votre réponse. Désolé pour la réponse lente. Je sais ce que vous dites, et votre réponse est sacrément correcte. Mais je ne sais toujours pas pourquoi le comportement est si mystérieux (Regardez le premier résultat). – Ziiip

+1

Lorsque les arguments sont passés à une fonction/méthode * variable argument *, comme 'stringWithFormat:' les * octets * de chaque valeur d'argument sont placés sur la pile de manière contiguë. La variable 'test1' est 64 bits, donc 8 octets sont placés sur la pile, ils sont suivis par les 8 octets de' test2', etc. Sur les formats '% zd' 32 bits, une valeur de 32 bits, donc pour chaque occurrence de '% zd' dans la chaîne de format, 4 octets de la pile sont utilisés. Lorsque la valeur décimale '11111111' est écrite comme un nombre binaire de 64 bits, les 32 bits supérieurs tous' 0'. Ainsi, les 8 octets de 'test1' sont formatés en deux valeurs de 4 octets, la seconde étant' 0'. – CRD

+0

Cela semble raisonnable! Merci beaucoup. Et, où puis-je apprendre cela? C'est une connaissance intéressante que je ne connais pas. – Ziiip