Гарантируется ли, что intptr_t безопасно переходит через uintptr_t? - PullRequest
2 голосов
/ 18 апреля 2020

Могу ли я взять intptr_t и присвоить или memcpy его для uintptr_t и обратно и гарантировать, что получим одно и то же значение?

То есть гарантируется одно из следующих действий: работа (без подтверждения):

Использование задания:

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

Использование memcpy:

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

Если это не гарантируется стандартом, можно проверить условие во время компиляции или выполнения, чтобы определить, гарантировано ли оно на конкретной платформе.

1 Ответ

4 голосов
/ 18 апреля 2020

Гарантируется работа memcpy, поскольку он обрабатывает значения как последовательность байтов. Назначение не гарантируется для работы, хотя, как правило, будет работать на любой машине, которая использует целые числа дополнения 2s. Машина, которая использует дополнение 1 или знак-величину, изменит значение от -0 до 0, хотя утверждение все равно будет в порядке, так как -0 == 0 истинно.

...