C# 使用流程时';内存,是否有理由使用uint而不是int?

C# 使用流程时';内存,是否有理由使用uint而不是int?,c#,.net,vb.net,C#,.net,Vb.net,我的意思是,根据我的理解,int(Int32)将从-2147483648变为2147483647。如果我没记错的话,windows下32位的每个程序都会像它有2gb的ram一样工作,所以我可以说我可以把任何地址“放在”int32中。这是真的吗?还是我应该坚持到底?我知道uint只适用于正整数,而且所有内存地址都是正整数,但我的问题更多的是“每个内存地址都适合int32吗?” 谢谢 编辑:从MSDN中我可以看到ReadProcessMemory()接受一个用于基址的size\t参数。什么映射了.n

我的意思是,根据我的理解,int(Int32)将从-2147483648变为2147483647。如果我没记错的话,windows下32位的每个程序都会像它有2gb的ram一样工作,所以我可以说我可以把任何地址“放在”int32中。这是真的吗?还是我应该坚持到底?我知道uint只适用于正整数,而且所有内存地址都是正整数,但我的问题更多的是“每个内存地址都适合int32吗?”

谢谢

编辑:从MSDN中我可以看到ReadProcessMemory()接受一个用于基址的size\t参数。什么映射了.net中的大小


edit2:好吧,现在我有点糊涂了。似乎是100%安全,我应该使用UINT而不是INT。因此,在使用互操作时,我应该使用UIntPtrs而不是IntPtrs。但我看到到处都有人在使用INTPTR。为什么呢?我们通常使用的所有东西都在第一个2gb内存中,所以使用标准ints没有问题吗?

我认为32位机器/进程的限制是4Gb而不是2gb。但是如果你使用敬畏,它可以被扩展。因此,Int32不适合存储内存地址。但是,除非您正在进行某种形式的互操作,否则直接存储内存地址可能是不合适的


编辑:因此,对于读取外部进程内存(这是互操作的一种形式),我肯定会使用无符号整数。

在32位体系结构中,32位指针可以寻址4GB的RAM。通常,该内存被拆分为2GB(较低的部分)用于进程,而较高的2GB用于操作系统。您可以通过boot.ini中的/3GB开关来改变此行为,该开关将为用户空间提供3GB,为操作系统提供1GB。
因此,我强烈建议使用无符号整数。

编辑:实际上,微软不推荐使用
uintpttr
。切换回
IntPtr
。(关于哪个“更好”的研究就是为什么要花这么长时间才能回答的原因!:)


另外,
size\u t
应该映射到.NET中的
System.IntPtr
。这是因为
size\u t
System.IntPtr
都将依赖于平台/比特数。
size\u t
是32位整数这一事实是一个实现细节——通过使用
System.IntPtr
,您可以有效地证明您的应用程序是面向未来的。请参阅。

AWE不会更改内存大小。它(地址窗口扩展)允许您将4GB可寻址空间内的窗口映射到外部(高于物理调用RAM中的4GB),但对于该过程,它仍将查看4GB内的窗口。因此,据我所知,我应该使用UINT。现在,由于这是指针相关的,我将使用UIntPtr而不是IntPtr,对吗?这回答了您关于大小的问题\u不要过多地阅读“IntPtr”的“Int”部分。这是一个提示,而不是一个实现细节的承诺。IntPtr以独立于位的方式处理您想要的内容。虽然它似乎不限于在其内部保持和int,但所有的ToString()、ToInt32()甚至ToInt64()都将首先在内部将内部值转换为int,然后才分别转换为string和long。所以看起来IntPtr实际上只是ints,而UIntPtr实际上是uints!事实上,这很奇怪。查看未发生的UIntPtr代码。我的意思是,使用UIntPtr,当您调用ToString()、ToUInt32()、ToUInt64()时,它不会尝试首先强制转换到uint,而只在转换到string和uint64之后。这确实意味着如果我使用IntPtr,我将始终是安全的,是吗?“safe”是一个相对术语,但
IntPtr
是正确的设计方法。我不太愿意使用“安全”这个词,因为在另一个进程的内存空间中进行挖掘通常不会有太多真正安全的地方。:)