12
votes

Intptr vs uintptr

Ceci devrait être simple: je vois partout les gens utilisent intptr , y a-t-il une raison pour laquelle je devrais utiliser uintptr à la place?


1 commentaires

Wow, je ne savais même pas qu'il y avait un uintptr . Pouvons-nous le nommer pour la fonctionnalité la plus inutile de .NET ?


3 Réponses :


9
votes

ne semble pas qu'il y aurait une bonne raison de. Du docs:

remarques

...

Le type INTPTR est conforme à CLS, tandis que le type UInTPTR n'est pas. seulement Le type INTPTR est utilisé dans le commun Langue Runtime . Le type uintptr est fourni principalement pour maintenir Symétrie architecturale avec le IntPTR Tapez.


1 commentaires

Cette réponse est marquée correcte tout en étant incorrecte.



8
votes

Eh bien selon Microsoft < Code> uintptr est fourni principalement pour la symétrie architecturale. Un autre point intéressant est que uintptr n'est pas conforme CLS.

Sur la surface, il semblerait que IntPTR soit l'option préférée. Cependant, si vous savez que vous allez faire du pointeur arithmétique, Uintptr peut être un meilleur choix puisque dans les chances hors probing, il y avait un problème obscur qui concerne les valeurs négatives.


0 commentaires

2
votes

Il y a une grande différence. Par exemple, sur une application 32 bits, nouveau uintptr (0xc01e0001) code> entraîne un pointeur au 3223191553, mais intPtr (0xc01e0001) code > Résultats dans un système.OverflowException: "L'opération arithmétique a abouti à un débordement". C'est-à-dire que 0xc01e0001 est supérieur à MaxValue pour INT32.

Donc, si on veut toujours un tel pointeur, un entier négatif doit être utilisé comme valeur interne pour IntPTR, comme P>

unchecked((IntPtr)(int)0xC01E0001)


2 commentaires

Ne peut pas reproduire overflowException par var p1 = nouveau intPTR (0xc01e0001); var p2 = (intPTR) 0xc01e0001;


@Chrisxue qui est probablement parce que vous utilisez une architecture de 64 bits, alors que j'utilisais seulement 32 bits. Donc, essentiellement, j'ai utilisé int32, vous avez utilisé INT64. Pour produire un débordement, vous avez besoin de grandes numéros. J'ai édité ma réponse.