%02x 陷阱

下面如果用 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 不代表只输出两位,而是至少输出两位。

参考文档:
https://stackoverflow.com/a/18438992/1107242

你可能感兴趣的:(%02x 陷阱)