c ++:为什么在整数前面减去信号给出一个疯狂的数字?

时间:2018-05-13 00:58:54

标签: c++ class operand

我正在使用SFML类中的整数来获取当前窗口的y坐标:

sf::window.getSize().y

这带来了例如值:

300

但我想要负值,所以我把减号放在前面:

- sf::window.getSize().y

然后我明白了:

4294966696

为什么会这样?

2 个答案:

答案 0 :(得分:1)

正如其他人在评论中所说,窗口大小存储为无符号整数,因此采取负面操作的操作最终只会创建一个非常大的正数。

答案 1 :(得分:1)

sf::window.getSize().y是无符号值。在否定之前将其转换为有符号值,例如:

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

至于为什么会发生这种情况,否定操作(很可能是二进制补码算法)将翻转最顶部的位,使得该值看起来像一个非常大的数字而不是负数。

@ NathanOliver在下面的评论是正确的。从无符号值转换为有符号值基本上会丢失一位,因此使用更大的类型是最安全的。实际上,如果您可以保证结果值足够小以适合签名类型,那么您可以自己选择要使用的签名类型。