下面如果用 0x7f 则不会有6个 f 前缀,用 0x8f 则有这个问题。
事实上 0x8f 最高位是1,所以 int8_t 类型会将它当成负数,%x会将其补为 int,高位补1,就看到一串 f;而在 uint8_t 或 long 的世界里是正数。
NSLog(@"%02x", 0x8f); // output: 8f
NSLog(@"%02x", (char)0x8f); // output: ffffff8f
NSLog(@"%02x", (int8_t)0x8f); // output: ffffff8f
NSLog(@"%02x", (uint8_t)0x8f); // output: 8f
NSLog(@"%02llx", (long long)0x8f); // output: 8f
%02x 不代表只输出两位,而是至少输出两位。