C++: почему знак минус перед целым числом дает сумасшедшее число?

Я использую целое число из класса SFML, чтобы получить координату Y текущего окна:

sf::window.getSize().y

Это приносит, например, значение:

300

Но я хочу отрицательное значение, поэтому я ставлю знак минус перед:

- sf::window.getSize().y

Тогда я получаю это:

4294966696

Почему это происходит?

2 ответа

Решение

sf::window.getSize().y является значением без знака. Приведите его к знаковому значению перед отрицанием, например:

-(int)sf::window.getSize().y

Что касается того, почему это происходит, операция отрицания (скорее всего, двойное дополнение к арифметике) перевернет самый верхний бит, в результате чего значение будет выглядеть как действительно большое число вместо отрицательного числа.

@ NathanOliver комментарий ниже является правильным. Преобразование значения без знака в значение со знаком в основном теряет один бит, поэтому безопаснее использовать больший тип. На практике, если вы можете гарантировать, что результирующее значение будет достаточно маленьким, чтобы вписаться в подписанный тип, вы можете сделать свой собственный выбор относительно того, какой тип со знаком использовать.

Как говорили другие в комментариях, размер окна сохраняется как целое число без знака, поэтому операция по его получению заканчивается тем, что создается просто большое положительное число.

Другие вопросы по тегам