【发布时间】:2013-10-20 14:25:57
【问题描述】:
#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?
【问题讨论】:
-
十六进制不关心有符号或无符号 - x 就是你所需要的。
-
%lux似乎被视为%lu+x -
你通过
1024代替256作为缓冲空间 -
您并没有真正尝试将 13835058055298940928 放入无符号长整数中,是吗?在我的系统(win7 x64)上,sizeof(long) 为 4 - 即 32 位长。这为您提供了 32 个无符号位的最大值:4294967295。看到问题了吗?你想把大象塞进兔笼。所有赌注都自动关闭!!实际上,您的数字是您可以放入 32 位的最大数字的 3,221,225,472.75 倍。它是无符号 64 位表示中可以容纳的最大数字的 75%。
-
@PaulR:十六进制(
"%x"格式)不关心有符号;无符号是你得到的全部。
标签: c