使用“长”的 Interop C#来自 c++
在我的系统上: c++ 中的 sizeof(long) 是 4 又名 32 位 c# 中的 sizeof(long) 是 8 又名 64 位
所以在我的互操作方法声明中,我一直用 c# int 替换 c++ long,但是我感觉这不安全?
为什么 C++ 中 long 与 int 大小相同?那么long long是64位吗?接下来长长长长是什么??
On my System:
sizeof(long) in c++ is 4 aka 32bits
sizeof(long) in c# is 8 aka 64 bits
So in my Interop method declarations I've been substituting c++ longs with c# int's however I get the feeling this isn't safe?
Why is a long the same size as an int in c++? And long long is 64bits? What's next a long long long long??
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
假设您有一个最新的 C 库,最好的办法是
include
并使用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 位指针。
Best thing to do assuming you have a recent C library is to
include <stdint.h>
and useuint64_t
,int64_t
,uint32_t
,int32_t
. This will works regardless of model of the underlying platform.But if you are curious, the underlying issue is that different systems use different models. On 32 bit systems, both Posix and Windows use ILP32, which means an integer, long and point are all 32 bits long.
For 64 bits, Posix and Windows use different models.
Posix usually uses LP64 which means 32 bit integers, 64 bit longs and 64 bit pointers.
Windows uses LLP64 which means 32 bit integers and longs, 64 bit long longs and 64 bit pointers.
是的,它是安全的,只要它们不是平台大小的整数(例如,x86 平台为 32 位,x64 平台为 64 位),在这种情况下,您可以使用
IntPtr
。不要忘记,在定义 C(++) 时,默认的计算大小不是 32 位。所以32位被定义为“长”。但是,较新的编程语言已采用新的默认大小。
Yes it is safe, as long as they aren't platform-sized integers (e.g. 32-bit for x86 platform and 64-bits for x64-platforms), in which case you'd use an
IntPtr
.Don't forget that at the time C(++) was defined, the default computation size wasn't 32 bits. So 32 bits was defined as "long". However, the newer programming languages have adopted the new default sizes.
在大多数平台上,C++
long
与int
相同,均为 4 个字节。这是 16 位时代的剩余部分,当时int
是 2 个字节,long 是双字 - 即 4 个字节。因此,如果您的 C++ 平台依赖于 32 位长整型,那么将它们转换为 C#
int
是非常安全的。On most platforms C++
long
is the same asint
and is 4 bytes. This was a remainder of the 16bit days whenint
was 2 bytes and long was double word - i.e. 4 bytes.So if your C++ platform relied on 32bit longs, converting those to C#
int
is plenty safe.