У меня есть интерфейс между клиентом и сервером, где клиент отправляет (1) значение без знака и (2) флаг, который указывает, подписано ли значение / нет. Затем сервер будет статически приводить беззнаковое значение к соответствующему типу.
Позже я узнал, что это поведение, определяемое реализацией, и я читал об этом, но не мог найти подходящего решения, которое было бы полностью безопасным? Я читал о каламбурах типов, преобразованиях указателей и memcpy.
Сработает ли просто использование профсоюзного типа? UnionType, содержащий подписанные и неподписанные int, а также флаг подписанный / беззнаковый. Для подписанных значений клиент устанавливает подписанную часть объединения, а сервер читает подписанную часть. То же самое для беззнаковой части. Или я что-то совсем не понимаю?
Дополнительный вопрос: как мне узнать конкретное поведение в этом случае для конкретного сценария, например. windriver diab на ппц? Я немного не понимаю, как найти такую документацию.
Ответ 1 · M.M
Решение union потребует, чтобы и клиент, и сервер использовали одно и то же представление, что не является хорошей идеей. (например, обе системы с прямым порядком байтов и прямым порядком байтов являются общими).
Вы должны каким-то образом сериализовать значение. Но вы просто делаете это отдельно для каждого типа.
Например (псевдокод)
void send_signed(int32_t x)
{
send(1, "s");
send(sizeof x, serialized x);
}
void send_unsigned(uint32_t x)
{
send(1, "u");
send(sizeof x, serialized x);
}
И на ресивере; вы сначала читаете шрифт. Если это "s", то вы десериализуете подписанный int и что-то с ним; и если это "u", вы десериализуете беззнаковое int (в другую переменную) и что-то с ним делаете.
Ответ 2 · Cheers and hth. - Alf
Преобразование unsigned int проблематично только формально. На практике все существующие платформы используют представление дополнения до двух, где unsigned int - полная противоположность int unsigned (которая формально четко определена). Так что проблем нет.
Взгляните на статью в Википедии о UNIVAC, чтобы увидеть пример платформы, в которой они дополняют представление был использован, например для 12- и 36-битных слов.