2 votes

Est-il garanti que intptr_t fait sûrement un aller-retour en toute sécurité via uintptr_t?

Puis-je prendre un intptr_t et l'assigner ou le copier dans un uintptr_t et ensuite le récupérer avec la même valeur garantie ?

C'est-à-dire, est-ce que l'une des deux options suivantes est garantie de fonctionner (pas d'assertion) :

En utilisant l'assignation :

intptr_t i1 = f();
uintptr_t u = i1;
intptr_t i2 = u;
assert(i1 == i2);

En utilisant memcpy :

intptr_t i1 = f();
uintptr_t u;
memcpy(&u, &i1, sizeof(u));
memcpy(&i2, &u, sizeof(u));
assert(i1 == i2);

Si ce n'est pas garanti par la norme, il est possible de vérifier une condition à la compilation ou à l'exécution pour déterminer si c'est garanti sur une plateforme particulière.

4voto

Chris Dodd Points 39013

Le memcpy est garanti de fonctionner, car il traite les valeurs comme une séquence d'octets. L'assignation n'est cependant pas garantie de fonctionner, bien qu'elle fonctionnera généralement sur n'importe quelle machine qui utilise des entiers en complément à 2. Une machine qui utilise le complément à 1 ou la magnitude du signe modifiera la valeur de -0 en 0, mais l'assertion sera toujours correcte, car -0 == 0 est vrai.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X