У меня есть прецедент, когда мне нужно преобразовать знаковые значения в 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
, но неясно, как поддерживать порядок сортировки с соблюдением.
(Обратите внимание, что это похоже на: Нет совместимого способа конвертировать подписанный/неподписанный одинаковый размер, за исключением того, что мне нужно, чтобы результаты поддерживали порядок сортировки)