C++: почему знак минус перед целым числом дает сумасшедшее число?
Я использую целое число из класса SFML, чтобы получить координату Y текущего окна:
sf::window.getSize().y
Это приносит, например, значение:
300
Но я хочу отрицательное значение, поэтому я ставлю знак минус перед:
- sf::window.getSize().y
Тогда я получаю это:
4294966696
Почему это происходит?
2 ответа
sf::window.getSize().y
является значением без знака. Приведите его к знаковому значению перед отрицанием, например:
-(int)sf::window.getSize().y
Что касается того, почему это происходит, операция отрицания (скорее всего, двойное дополнение к арифметике) перевернет самый верхний бит, в результате чего значение будет выглядеть как действительно большое число вместо отрицательного числа.
@ NathanOliver комментарий ниже является правильным. Преобразование значения без знака в значение со знаком в основном теряет один бит, поэтому безопаснее использовать больший тип. На практике, если вы можете гарантировать, что результирующее значение будет достаточно маленьким, чтобы вписаться в подписанный тип, вы можете сделать свой собственный выбор относительно того, какой тип со знаком использовать.
Как говорили другие в комментариях, размер окна сохраняется как целое число без знака, поэтому операция по его получению заканчивается тем, что создается просто большое положительное число.