什么是 __int32?

Posted

技术标签:

【中文标题】什么是 __int32?【英文标题】:What's __int32? 【发布时间】:2016-07-14 10:10:03 【问题描述】:

我一直在努力理解this。这是一个名为W32TIME_STATUS_INFO 的结构的参考页面。

 typedef struct 
   unsigned __int32 ulSize;
   unsigned __int32 eLeapIndicator;
   unsigned __int32 nStratum;
   signed __int32 nPollInterval;
   unsigned __int32 refidSource;
   unsigned __int64 qwLastSyncTicks;
   signed __int64 toRootDelay;
   unsigned __int64 tpRootDispersion;
   signed __int32 nClockPrecision;
   [string, unique] wchar_t* wszSource;
   signed __int64 toSysPhaseOffset;
   unsigned __int32 ulLcState;
   unsigned __int32 ulTSFlags;
   unsigned __int32 ulClockRate;
   unsigned __int32 ulNetlogonServiceBits;
   unsigned __int32 eLastSyncResult;
   unsigned __int64 tpTimeLastGoodSync;
   unsigned __int32 cEntries;
   [size_is(cEntries)] PW32TIME_ENTRY pEntries;
  W32TIME_STATUS_INFO,
  *PW32TIME_STATUS_INFO;

我想在 C# 代码中使用 W32TimeQueryStatus here 方法,但我不知道应该如何在 C# 代码中定义结构,并且该方法将指向它的指针作为参数。这些__int32__int64 是什么?我已经搜索过“双下划线 c”等,但我发现的所有内容都非常不具体。

我可能不得不单独询问 handle_t 参数,所以现在我只想询问有关定义此结构并将其传递给 C# 中的 PInvoked 方法的问题。

【问题讨论】:

这是一个有符号整数数据类型,保证为 32 位长。 msdn.microsoft.com/en-us/library/29dh1w7z.aspx @πάνταῥεῖ 谢谢,所以我应该在 C# 代码中使用 Int32 Int32 和 Int64 分别是 IntPtr(或 UIntPtr):msdn.microsoft.com/en-us/library/ms235282.aspx 【参考方案1】:

使用google 和第一个链接MSDN 说:

Microsoft C/C++ 功能支持大小整数类型。你可以 使用 __intn 声明 8、16、32 或 64 位整数变量 类型说明符,其中 n 为 8、16、32 或 64。

正如您在MSDN 上看到的那样,c# 等效于System.Int64

【讨论】:

【参考方案2】:

摘自 2003 C++ 标准:

每个包含双下划线 (__) 或以下划线后跟大写字母 (2.11) 的名称都保留给实现以供任何使用。

为了简化,__int32 是 32 位编码的 int 和 64 位编码的 __int64。您消除了标准 int 类型的大小抽象,这样您就可以确定变量将分配 4字节精确

【讨论】:

【参考方案3】:

将“unsigned __int32”替换为“Uint32”,对于有符号的__int32,使用“Int32”。 __int64 也是如此。

【讨论】:

【参考方案4】:

正如其他人所说,signed __int32 是 32 位 2 的补码整数,unsigned __int32 是 32 位无符号整数。

int32 之前使用__ 形成__int32 使其成为保留 标识符。这样做的一个重要优势是它不会与兼容的预先存在的用户代码冲突

像下面这样使用会鼓励编译器依赖

unsigned __int32 ulSize;

最好使用以下内容。即使没有为您的编译器提供<stdint.h>,也存在在线编译器。

#include <stdint.h>
uint32_t ulSize;

【讨论】:

以上是关于什么是 __int32?的主要内容,如果未能解决你的问题,请参考以下文章

int32,int,int32_t,int8和int8_t之间的区别

什么是 uint_fast32_t,为什么要使用它来代替常规的 int 和 uint32_t?

int32、int、int32_t、int8和int8_t的区别

std::unordered_map<int32_t, int32_t> 在堆上声明

为啥 INT_FAST16_MAX 被定义为 INT32_MAX (VS 2015)?

uint32_t 和 u_int32_t 的区别