8
#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, thensnprintf不做任何转换。它只是打印0x13835058055298940928x,而如果我使用 just %lx,它会打印预期的十六进制转换。

如何以十六进制表示 unsigned long?

4

1 回答 1

20

的格式"%lux"被视为"%lu"(unsigned long, decimal) 后跟一个字母x

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

以十六进制打印unsigned long值的格式是"%lx". (x是十六进制,d是有符号十进制,u是无符号十进制;它们中的任何一个都可以用llong 来限定。)

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

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

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

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

于 2013-10-20T15:04:32.907 回答