在C中,LARGE_INTEGER.QuadPart在printf中捕获两次

qyuhtwio  于 2023-01-12  发布在  其他
关注(0)|答案(3)|浏览(74)

我想打印出一个文件的大小和名称。

LARGE_INTEGER filesize;
filesize.LowPart = ...
...
printf("%ld %s\n", filesize.QuadPart, file.cFileName);

这将导致

42 (null)

然而,当我多加了一个%s(和第三个)

printf("%ld %s %s %s\n", filesize.QuadPart, file.cFileName, "foo");

我明白了

42 (null) hello.c foo

显然,简单的修复方法就是在它自己的printf语句中隔离文件大小,但我仍然对为什么会发生这种情况感到困惑。

oxiaedzo

oxiaedzo1#

正确的打印方式应该是inttypes.h和宏PRI64d。- Olaf
标准的方法是使用宏PRId64,例如。

printf("%"PRId64" %s\n", filesize.QuadPart, file.cFileName);
rfbsl7qr

rfbsl7qr2#

%lld就是您要查找的内容。
这样使用:

#include <iostream>
#include <limits.h>
#include <stdint.h>

typedef uint8_t BYTE;
typedef uint32_t DWORD;
typedef long int LONG;
typedef long long int LONGLONG;

typedef union _LARGE_INTEGER {
  struct {
    DWORD LowPart;
    LONG  HighPart;
  } DUMMYSTRUCTNAME;
  struct {
    DWORD LowPart;
    LONG  HighPart;
  } u;
  LONGLONG QuadPart;
} LARGE_INTEGER, *PLARGE_INTEGER;

int main()
{
    long long int d = LLONG_MAX;
    LARGE_INTEGER e;
    e.QuadPart = LLONG_MIN;
    printf("LONG LONG INT VALUE >> %lld \t %lld \n", d, e.QuadPart); 

    return 0;
}
9bfwbjaz

9bfwbjaz3#

为什么要使用LARGE_INTEGER?__int64支持原生64,还有cstdint. h支持int64_t(不知道Visual Studio是否支持,但其他编译器支持)。
同样,如果你想打印这么大的变量,你需要%I64d。这是微软的方式来表示“我们不支持标准”。

相关问题