c ++: почему сигнал минус перед целым числом дает сумасшедшее число? - PullRequest
0 голосов
/ 13 мая 2018

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

sf::window.getSize().y

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

300

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

- sf::window.getSize().y

Затем я получаю это:

4294966696

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

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

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

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

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

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

0 голосов
/ 13 мая 2018

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

...