2

在我的系统上:c++ 中的 sizeof(long) 是 4 也就是 32 位 c# 中的 sizeof(long) 是 8 也就是 64 位

因此,在我的 Interop 方法声明中,我一直在用 c# int 替换 c++ longs 但是我觉得这不安全?

为什么 long 与 c++ 中的 int 大小相同?而long long是64位?接下来是什么长长长长长??

4

3 回答 3

7

假设您有一个最近的 C 库,最好的办法是include <stdint.h>使用uint64_t, int64_t, uint32_t, int32_t. 无论底层平台的模型如何,这都将起作用。

但如果你好奇,根本问题是不同的系统使用不同的模型。在 32 位系统上,Posix 和 Windows 都使用 ILP32,这意味着整数、长整数和点都是 32 位长。

对于 64 位,Posix 和 Windows 使用不同的模型。

Posix 通常使用 LP64,这意味着 32 位整数、64 位长整数和 64 位指针。

Windows 使用 LLP64,这意味着 32 位整数和长整数、64 位长整数和 64 位指针。

于 2010-05-10T06:11:44.177 回答
0

是的,它是安全的,只要它们不是平台大小的整数(例如,x86 平台为 32 位,x64 平台为 64 位),在这种情况下,您将使用IntPtr.

不要忘记在定义 C(++) 时,默认计算大小不是 32 位。所以 32 位被定义为“长”。但是,较新的编程语言采用了新的默认大小。

于 2010-05-10T06:11:12.120 回答
-1

在大多数平台上,C++ 与 C++long相同int,都是 4 个字节。这是 16 位天的剩余部分,当时int是 2 个字节,而 long 是双字 - 即 4 个字节。

So if your C++ platform relied on 32bit longs, converting those to C# int is plenty safe.

于 2010-05-10T06:12:45.257 回答