Преобразование unsigned типа к signed
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 10.05.06 06:37
Оценка:
Привет всем.

Что-то я конкретно затупил в "понедельник"

Есть две переменных
signed __int64    sv; //результат работы
unsigned __int64  usv; //промежуточная переменная

В usv я формирую значение (например, преобразую из текстового представления). Результат возвращается знаковый — в sv.

Когда я обрабатываю положительное число, все ясно — проверяем, что usv <= _I64_MAX. Вот когда отрицательное — затупил. Изначально был такой код:
if(usv>(static_cast<unsigned __int64>(_I64_MAX))+1)
 return DISP_E_OVERFLOW;

sv=-usv;

Все работало замечательно, пока этот код не увидел VC7
warning C4146: unary minus operator applied to unsigned type, result still unsigned

Ну, думаю, это не порядок и нужно переделать. Написал:
sv=-static_cast<__int64>(usv);

Предупреждение пропало, но меня начало колбасить другое — есть гарантии что здесь нет и не будет проблем? Бинарное представление usv и sv я себе представляю, но вот как максимально корректно (с точки зрения плюсов), без нагромождения if-ов, преобразовать их друг в друга — туплю

Есть желание написать
usv=(~usv)+1;

sv=*reinterpret_cast<const __int64*>(&usv);

-- Пользователи не приняли программу. Всех пришлось уничтожить. --
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.