c ++:为什么整数前面的减号会给出一个疯狂的数字?
c++: Why minus signal in front of an integer gives a crazy number?
我正在使用来自 SFML class 的整数来获取当前 window:
的 y 坐标
sf::window.getSize().y
这带来了例如值:
300
但是我想要负值,所以我把负号放在前面:
- sf::window.getSize().y
然后我明白了:
4294966696
为什么会这样?
正如其他人在评论中所说 window 大小存储为无符号整数,因此取负数的操作最终只会创建一个非常大的正数。
sf::window.getSize().y
是一个无符号值。在取反之前将其转换为有符号值,例如:
-(int)sf::window.getSize().y
至于为什么会发生这种情况,取反运算(很可能是二进制补码运算)会翻转最高位,使该值看起来像一个非常大的数而不是负数。
@NathanOliver 下面的评论是正确的。从无符号值转换为有符号值基本上会丢失一位,因此使用更大的类型是最安全的。实际上,如果您可以保证结果值足够小以适合有符号类型,那么您可以自行选择要使用的有符号类型。
我正在使用来自 SFML class 的整数来获取当前 window:
的 y 坐标sf::window.getSize().y
这带来了例如值:
300
但是我想要负值,所以我把负号放在前面:
- sf::window.getSize().y
然后我明白了:
4294966696
为什么会这样?
正如其他人在评论中所说 window 大小存储为无符号整数,因此取负数的操作最终只会创建一个非常大的正数。
sf::window.getSize().y
是一个无符号值。在取反之前将其转换为有符号值,例如:
-(int)sf::window.getSize().y
至于为什么会发生这种情况,取反运算(很可能是二进制补码运算)会翻转最高位,使该值看起来像一个非常大的数而不是负数。
@NathanOliver 下面的评论是正确的。从无符号值转换为有符号值基本上会丢失一位,因此使用更大的类型是最安全的。实际上,如果您可以保证结果值足够小以适合有符号类型,那么您可以自行选择要使用的有符号类型。