- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这是一个看起来很简单的问题:
鉴于 native 大小的整数最适合算术,为什么 C#(或任何其他 .NET 语言)不支持使用 native 大小的算术 IntPtr
和 UIntPtr
?
理想情况下,您可以编写如下代码:
for (IntPtr i = 1; i < arr.Length; i += 2) //arr.Length should also return IntPtr
{
arr[i - 1] += arr[i]; //something random like this
}
这样它就可以在 32 位和 64 位平台上运行。 (目前,您必须使用 long
。)
编辑:
我没有将它们用作指针(甚至没有提到“指针”这个词)!它们可以被视为 native int
的 C# 对应物。在 MSIL 和 intptr_t
在 C 中 stdint.h
-- 是整数,不是指针。
最佳答案
在 .NET 4 中,IntPtr
类型的左手操作数与整数类型的右手操作数(int
、long
)之间的算术运算等)被支持。
[编辑]:正如其他人所说,它们旨在表示本地语言中的指针(正如名称 IntPtr 所暗示的那样)。可以声称您将它们用作 native 整数而不是指针,但您不能忽视整数的 native 大小一直很重要的主要原因之一是用作指针。如果您要执行数学运算或其他独立于运行代码的处理器和内存体系结构的通用函数,则可以说使用 int
和 long
,无论硬件如何,您都知道它们在每种情况下的固定大小和上限和下限。
正如 IntPtr
类型被设计用来表示本地指针一样,算术运算被设计用来表示您将对指针执行的逻辑数学运算:将一些整数偏移量添加到本地指针到达一个新的 native 指针(不是不支持添加两个 IntPtr
,也不使用 IntPtr
作为右手操作数)。
关于c# - 为什么我们不能在 C# 中进行 IntPtr 和 UIntPtr 运算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5589846/
在Go的runtime/proc.go中,有一段代码如下所示: // funcPC returns the entry PC of the function f. // It assumes that
我想在 Go 中实现一个弱引用,以便我可以使用终结器来检测何时不再需要数据结构并能够存储/清理数据。 我发现的一种方法是使用 uintptr 作为映射键,这样当调用终结器时,我可以使用传递给终结器函数
这应该很简单:我到处都看到人们使用 IntPtr,我有什么理由应该改用 UIntPtr 吗? 最佳答案 似乎没有充分的理由这样做。来自文档: Remarks ... The IntPtr type i
我只是找不到获取指向给定结构的每个属性的指针片段的方法。我正在使用反射来获取我的指示(感谢 https://stackoverflow.com/a/24348352/6093604 ) if valu
我正在尝试将系统调用与 user32.dll 结合使用以获取剪贴板的内容。我希望它是来自打印屏幕的图像数据。 现在我得到了这个: if opened := openClipboard(0); !ope
我需要将字符串作为参数传递给 golang 中的 C DLL,我想得到这样的东西: proc, e = syscall.GetProcAddress(h, "JLINKARM_ExecComman
我正在查看 RegOpenKeyEx 的 P/Invoke 声明当我注意到页面上的这条评论时: Changed IntPtr to UIntPtr: When invoking with IntPtr
我试过这样转换它: UIntPtr x = (UIntPtr)intPtr; ...但是编译器对此不太满意并返回编译错误。 我需要进行转换,因为 RegOpenKeyEx 的 P/Invoke 签名需
在下面的代码中,Resharper 给我一个警告:Cannot cast expression of type 'Color' to type 'UIntPtr'。 (实际上,Resharper 认为
我在 golang 网站上读到 uintptr 存储指针值的未解释位,我在网上找到的那种答案非常困惑。有人可以用简单的词向我解释一下吗。 最佳答案 简答:当您需要像使用数字一样使用地址时使用它。 Go
根据文档(https://golang.org/pkg/unsafe/#Sizeof)unsafe.Sizeof返回给定表达式的大小(以字节为单位)。理想情况下,任何给定表达式的大小都可以用 uint
给定 // I know that behind SomeInterface can hide either int or a pointer to struct // In the real cod
我尝试使用来自 golang 包的系统调用调用 WindowsAPI(尽量不要使用 cgo),但我面对 uintptr 我不知道如何访问 uintptr 具有其地址的数据 这是我正在做的代码 pack
Go 编程语言在第 13.2 节中说这是代码是安全的并且 x 将始终对垃圾收集器可见: pb := (*int16)(unsafe.Pointer( uintptr(unsafe.Pointer(
根据Golang tour ,我们提供了以下整数类型: int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr 理
我需要在我的 C# .NET 2.0 应用程序中将 UIntPtr 对象转换为 IntPtr 对象。如何做到这一点?我不认为它像这样简单: UIntPtr _myUIntPtr = /* Some i
我不知道怎么办。它不使用 []byte(uintptr(0)) 进行编译。 请给我举个例子。 最佳答案 这取决于您机器的架构(32 位或 64 位)以及您希望如何对其进行编码(小端或大端)。无论哪种方
我正在尝试将在 uintptr 类型的变量中找到的值分配给 Go 中的 uint64 变量。使用 myVar = valFromSystem 给我 cannot use valFromSystem (
这是一个看起来很简单的问题: 鉴于 native 大小的整数最适合算术,为什么 C#(或任何其他 .NET 语言)不支持使用 native 大小的算术 IntPtr和 UIntPtr ? 理想情况下,
我是一名优秀的程序员,十分优秀!