- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
根据 this MSDN 页面,数据类型 LONGLONG 定义如下。
#if !defined(_M_IX86)
typedef __int64 LONGLONG;
#else
typedef double LONGLONG;
#endif
它说 LONGLONG 是一个 64 位有符号整数。但是double
是浮点型,不是整型。那么,我发现错字了吗?还是我漏掉了一点?
最佳答案
这是一个文档错误。它看起来是从源代码到文档的有损转换1。 winnt.h 中的实际定义要复杂一些:
//
// __int64 is only supported by 2.0 and later midl.
// __midl is set by the 2.0 midl and not by 1.0 midl.
//
#define _ULONGLONG_
#if (!defined (_MAC) && (!defined(MIDL_PASS) || defined(__midl)) && (!defined(_M_IX86) || (defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 64)))
typedef __int64 LONGLONG;
typedef unsigned __int64 ULONGLONG;
#define MAXLONGLONG (0x7fffffffffffffff)
#else
#if defined(_MAC) && defined(_MAC_INT_64)
typedef __int64 LONGLONG;
typedef unsigned __int64 ULONGLONG;
#define MAXLONGLONG (0x7fffffffffffffff)
#else
typedef double LONGLONG;
typedef double ULONGLONG;
#endif //_MAC and int64
#endif
要了解发生了什么,让我们通过删除所有不直接相关的内容来简化它。
defined(_MAC)
的计算结果为 0。defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 64
的计算结果为 1。appears to be true甚至可以追溯到 Visual C++ 6.0。_ULONGLONG_
、ULONGLONG
、MAXLONGLONG
)。定义现在更容易解析:
//
// __int64 is only supported by 2.0 and later midl.
// __midl is set by the 2.0 midl and not by 1.0 midl.
//
#if !defined(MIDL_PASS) || defined(__midl)
typedef __int64 LONGLONG;
#else
typedef double LONGLONG;
#endif
有了它,应该清楚条件是保护 MIDL 编译器(而不是 C++ 编译器)。上面的评论也有道理:MIDL 编译器 2 的第 1 版不支持将 __int64
作为关键字,但第 2 版(及更高版本)支持。
翻译成英文:如果此代码未被 MIDL 编译器解析,或者 MIDL 编译器的版本为 2 或更高版本,则将 LONGLONG
别名为 __int64
。否则(即使用 MIDL 编译器版本 1),尽量选择 double
。
这在今天几乎没有实际用处。您可以假设 LONGLONG
是 __int64
的别名,无论该定义是由 MIDL 还是 C++ 编译器提取的。我找不到 MIDL.exe 的版本历史记录,但我认为版本 1 是“古老的”。
1 我不愿意接受让 .NET 开发人员编写工具以从源代码生成 C 文档是一个好主意™。
2 这是指编译器版本,而不是 MIDL 语言版本。
关于winapi - Windows API 中的 LONGLONG 数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67684386/
在此示例中,m_Amount 是 CString。 stringToNumber 函数将其成功转换为 LONGLONG 数字。但是当我想将它分配给一个变体时,我得到了这个错误: error C2440
根据 this MSDN 页面,数据类型 LONGLONG 定义如下。 #if !defined(_M_IX86) typedef __int64 LONGLONG; #else typedef
根据this article中的表格, Variant 类型不支持 VARENUM.VT_I8 - 这映射到 VBA 的 VbVarType.vbLongLong .这向我表明 Variant 不能容
我正在移植一些代码并遇到了这个 class Someclass { void Restart (IN TIMEX_STAMP rtMinTime = 0I64); }; 此代码在 visual
UINT One = 1; LONG mylong = LONG(-1) * One; LONGLONG mylonglong1 = LONG(-1) * One; LONGLONG
尝试执行以下代码时,出现 VBA 错误:类型不匹配。任何人都知道原因(和解决方案?:-)) 我将数据类型从 Long 更改为 LongLong,以便能够处理更大的数字。在此之前,代码(摘录)运行良好。
我正在尝试使用 Core Data 存储 long long 值。像 119143881477165 这样的值。我将该值存储在 NSNumber 中,该值是使用便捷方法 numberWithUnsig
当我做的时候 SELECT (column1 == 1) AS isOne FROM table1; 我希望得到一个包含 BOOL 类型列的结果集,又名 TINYINT(1)。不幸的是,我收到了“LO
我习惯在 Excel 2010(Windows 7 64 位)上使用以下代码,效果很好。 Sub code_on_2010() Dim i As Long i = InputBox("inpu
我是一名优秀的程序员,十分优秀!