我阅读了文档,它说很长的是%li但打印出来的时候是-2147024891。是什么赋予了?
答案 0 :(得分:12)
您甚至没有提供想要打印的数字,但我猜您已经无意中看到了签名和未签名打印之间的区别。
对unsigned long
号码使用“%lu”,对signed long
号码使用“%ld”或“%li”。
MSDN有关于printf说明符的良好文档。对于64位值(例如long long
),您应该使用“inttypes.h”中的宏。
答案 1 :(得分:7)
您正在尝试打印HRESULT,即“拒绝访问”的错误代码。这最好用十六进制格式化,至少对于程序员来说很容易识别。
printf("0x%08lx", hr);
现在,您将立即识别设施代码7(Windows API)和错误代码5(访问被拒绝)。
答案 2 :(得分:0)
您是否将未签名的值打印为已签名?使用二进制补码时,设置最高位的值将打印为负数。尝试%u代表未签名的
答案 3 :(得分:0)
%ld或%lu取决于您需要的“长”。
答案 4 :(得分:0)
鉴于代码:
#include <stdio.h>
int main(void)
{
long l1 = +2147024891;
long l2 = -2147024891;
printf("%+11li = 0x%lx\n", l1, l1);
printf("%+11li = 0x%lx\n", l2, l2);
return(0);
}
以32位模式(在MacOS 10.6.2上)编译的输出是:
+2147024891 = 0x7ff8fffb
-2147024891 = 0x80070005
以64位模式编译的输出是:
2147024891 = 0x7ff8fffb
-2147024891 = 0xffffffff80070005
既然你没有告诉我们你写的是什么以及为什么你期望不同的东西,很难说出什么可能是错的。然而,尽管相对不寻常,“%li
”转换在C89和C99中,所以这应该是正确的。更正常的转化说明符是“%ld
”(“%li
”的同义词)和“%lu
”(以及“%lo
”和“%lx
” )对于无符号值。
答案 5 :(得分:0)
尝试%llu以及为长变量赋值也不要忘记你必须在数字的末尾添加“LL”,例如a = 999999999LL