无符号长十六进制表示

Shr*_*dha 8 c

#include <stdio.h>
#include <string.h>

int main(void) {
    char buf[256] = {};
    unsigned long i=13835058055298940928;
    snprintf(buf, 1024, "%lx", i); /* Line 7 */
    printf("%s\n",buf);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在第7行,如果我使用%lux那么snprintf不进行任何转换,只打印0x13835058055298940928x,而如果我只使用%lx,它会打印一个预期的十六进制转换.

如何用十六进制表示无符号长整数?

Kei*_*son 19

格式"%lux""%lu"(无符号长整数,十进制)后跟一个字母x.

"%x"格式要求的无符号类型的参数; 没有(直接)机制以十六进制格式打印有符号整数.

unsigned long以十六进制打印值的格式为"%lx".(x是十六进制,d有符号十进制,u是无符号十进制;其中任何一个都可以l长期限定.)

请注意,该值13835058055298940928至少需要64位无符号类型才能存储而不会溢出.类型unsigned long至少为32位; 在某些系统上它是64位,但绝不是全部.如果您希望代码是可移植的,则应使用type unsigned long long而不是unsigned long.unsigned long long以十六进制打印值的格式为"%llx".

为清楚起见,我通常在十六进制输出之前0x,因此读者很明显它是一个十六进制数:

printf("0x%llx\n", some_unsigned_long_long_value);
Run Code Online (Sandbox Code Playgroud)

(您可以使用相同的结果%#llx,但我发现写出0x比记住#标志的含义更容易.)