#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
,它会打印预期的十六进制转换。
如何用十六进制表示 unsigned long?
最佳答案
"%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
比记住#<的含义更容易
标志。)
关于c - 无符号长十六进制表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19478509/