使用“长”的 Interop C#来自 c++

发布于 2024-08-31 12:39:32 字数 199 浏览 8 评论 0原文

在我的系统上: 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

清醇 2024-09-07 12:39:32

假设您有一个最新的 C 库,最好的办法是 include 并使用 uint64_tint64_tuint32_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 use uint64_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.

安穩 2024-09-07 12:39:32

是的,它是安全的,只要它们不是平台大小的整数(例如,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.

怪我太投入 2024-09-07 12:39:32

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

因此,如果您的 C++ 平台依赖于 32 位长整型,那么将它们转换为 C# int 是非常安全的。

On most platforms C++ long is the same as int and is 4 bytes. This was a remainder of the 16bit days when int 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文