在我的系统上:c++ 中的 sizeof(long) 是 4 也就是 32 位 c# 中的 sizeof(long) 是 8 也就是 64 位
因此,在我的 Interop 方法声明中,我一直在用 c# int 替换 c++ longs 但是我觉得这不安全?
为什么 long 与 c++ 中的 int 大小相同?而long long是64位?接下来是什么长长长长长??
在我的系统上:c++ 中的 sizeof(long) 是 4 也就是 32 位 c# 中的 sizeof(long) 是 8 也就是 64 位
因此,在我的 Interop 方法声明中,我一直在用 c# int 替换 c++ longs 但是我觉得这不安全?
为什么 long 与 c++ 中的 int 大小相同?而long long是64位?接下来是什么长长长长长??
假设您有一个最近的 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 位指针。
是的,它是安全的,只要它们不是平台大小的整数(例如,x86 平台为 32 位,x64 平台为 64 位),在这种情况下,您将使用IntPtr
.
不要忘记在定义 C(++) 时,默认计算大小不是 32 位。所以 32 位被定义为“长”。但是,较新的编程语言采用了新的默认大小。
在大多数平台上,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.