У меня есть прецедент, когда мне нужно преобразовать знаковые значения в unsigned, чтобы значения сортировались. Мне нужно это для char, short, int, long и long long
С помощью сортировки я имею в виду, что для signed типа X, если (a < b), то преобразование в unsigned converted(a) < converted(b). Обратите внимание, что во многих случаях преобразование из отрицательного значения signed непосредственно в значение unsigned сделает значение больше, чем 0, и разрывает это ограничение (две реализации дополнения)
Простейшей идеей для char является:
unsigned char convert(char x)
{
return (unsigned char)(x ^ 0x80); // flip sign to make it sortable
}
Но это кажется undefined behavior.
В то время как можно было бы преобразовать в более крупный тип, добавить значения типа MIN и преобразовать в тип unsigned, я не уверен, что это более совместимо и не будет работать с long long
Как это можно сделать без каких-либо undefined behavior для всех типов?
Кажется безопасным преобразование с помощью memcpy, но неясно, как поддерживать порядок сортировки с соблюдением.
(Обратите внимание, что это похоже на: Нет совместимого способа конвертировать подписанный/неподписанный одинаковый размер, за исключением того, что мне нужно, чтобы результаты поддерживали порядок сортировки)