首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IntPtr加法

IntPtr加法
EN

Stack Overflow用户
提问于 2009-11-10 10:16:34
回答 3查看 3.2K关注 0票数 1

因此,据我所知,我发现的每个IntPtr加法的托管示例都是错误的

例如:http://www.atalasoft.com/cs/blogs/stevehawley/archive/2006/10/16/10987.aspx

我的想法是,如果IntPtr位于(或接近) int32.MaxValue在32位系统上,并且添加了一个溢出int32的偏移量,这不是一个有效的内存地址(因为它在uint32中是有效的,用IntPtr中的负数表示)?!

我认为代码应该是这样的:

代码语言:javascript
复制
public static IntPtr Offset(IntPtr src, int offset)
{
    switch (IntPtr.Size) {
    case 4:
        return new IntPtr((int)((uint)src + offset));
    case 8:
        return new IntPtr((long)((ulong)src + offset));
    default:
        throw new NotSupportedException("Not supported");
    }
}

我疯了吗?

有人有一个尝试过的、真实的IntPtr添加示例吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-11-10 10:49:39

我认为重点是,如果您溢出一个int,您仍然得到适当的值。试试这个:

代码语言:javascript
复制
//-2147483645
Console.WriteLine( int.MaxValue + 4 );

//2147483651
Console.WriteLine( (uint)(int.MaxValue + 4) );

假设int.MaxValue为2147483647,将溢出的负数转换为uint实际上会给出正确的值。

票数 1
EN

Stack Overflow用户

发布于 2010-04-22 16:03:34

.NET 4.0添加了一个新的静态方法IntPtr.Add(IntPtr指针,int偏移量)。

在早期的.NET版本中,转换为整数的另一种方法是使用“不安全”代码块并将IntPtr转换为(字节*)。执行您的添加,并将结果返回到IntPtr。编译器负责指针宽度的详细信息。:-)

示例:

代码语言:javascript
复制
  new IntPtr((byte *)pipe.Root + EventNameOffset)

或者:

代码语言:javascript
复制
  (IntPtr)((byte *)pipe.Root + EventNameOffset)
票数 1
EN

Stack Overflow用户

发布于 2009-11-10 10:31:35

在添加之前,将IntPtr转换为uint,然后应用偏移量。这将正确工作,但结果是一个long

据我所知,不可能添加ulong和int,因此64位指针部分是不正确的。实际上,它甚至不编译。我真的想不出一个优雅的解决方案,但是仅仅使用long可能是安全的。不过,这是sh*tload内存的一半,您可以使用*,8个艾字节:)内存地址映射理论上可能是一个问题。

*:好吧,如果当前的.NET框架实现不能阻止您这样做,那么当然,在long之前:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1706903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档