无符号长十六进制表示

时间:2013-10-20 14:25:58

标签: 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;
}

在第7行中,如果我使用%lux,则snprintf不进行任何转换,只打印0x13835058055298940928x,而如果我只使用%lx,则会打印{{1}}预期的十六进制转换。

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

1 个答案:

答案 0 :(得分:18)

格式"%lux"被视为"%lu"(无符号长整数,小数),后跟字母x

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

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

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

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

printf("0x%llx\n", some_unsigned_long_long_value);

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