我怎么打印很长的?这不应该工作吗?李%

时间:2010-02-13 19:15:20

标签: c printf

我阅读了文档,它说很长的是%li但打印出来的时候是-2147024891。是什么赋予了?

6 个答案:

答案 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