gpt4 book ai didi

c++ - 如何增加 LARGE_INTEGER

转载 作者:搜寻专家 更新时间:2023-10-31 01:31:32 26 4
gpt4 key购买 nike

我试图在 C++ 中增加 LARGE_INTEGER,但出现以下错误。

Error C2397: conversion from 'LONGLONG' to 'DWORD' requires a narrowing conversion

我不知道我做错了什么。这是一个非常简单的问题,我尝试重建项目,但错误不会消失。

std::atomic<LARGE_INTEGER> value; // this field is defined in header

这些行是我试过的,它们都给出相同的错误。

// inside a method in cpp
value = {get_some_large_integer().QuadPart + 1};

value = LARGE_INTEGER{get_some_large_integer().QuadPart + 1};

value = static_cast<LARGE_INTEGER>(LARGE_INTEGER{get_some_large_integer().QuadPart + 1});

最佳答案

您可以直接使用 Quadpart。请注意,它是一个 64 位长整数。也被 MS 编译器和 gcc 称为 long long 和 __int64。由于它是一种普通的旧数据类型,因此编译器支持使用它完成的所有算术和按位运算。

大整数的定义

typedef union _LARGE_INTEGER {
struct {
DWORD LowPart;
LONG HighPart;
};
struct {
DWORD LowPart;
LONG HighPart;
} u;
LONGLONG QuadPart; // <-- this is a 64 bit integer.
} LARGE_INTEGER, *PLARGE_INTEGER;

LARGE_INTEGER 是一个普通的 C union ,因此不提供任何构造函数。但是,您可以使用 C 聚合初始值设定项将其初始化为零。

LARGE_INTEGER li = {};  // initialize to zero.

使用 QuadPart,您可以像操作任何 long long 整数一样操作 LARGE_INTEGER...

递增:

li.QuadPart++;

添加:

__int128 i = 123456LL;
li.QuadPart += i;

等...

li.QuadPart = 123456LL * 5;

重要提示:出于历史原因和强制 long long 对齐,MS 使用 LARGE_INTEGER union 来传递如此长的 long 值。如果 Quadpart 未正确对齐,某些 Windows API 将崩溃。因此,在调用 Windows API 时简单地将 __int64* 转换为 LARGE_INTEGER* 并不是好的做法。

在 64 位窗口中,64 位增量即 li.Quadpart++ 是原子操作。

关于c++ - 如何增加 LARGE_INTEGER,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45643430/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com