如何解决有人可以用 C++ 解释这个简单程序的输出吗?
在我们的代码库中调试问题时,我偶然发现了一个与下面的示例问题非常相似的问题
#include <iostream>
#include <vector>
int main() {
std::vector<int> v;
int MAX = 100;
int result = (v.size() - 1) / MAX;
std::cout << result << std::endl;
return 0;
}
我希望程序的输出应该是 0,但它是 -171798692。
有人能帮我理解这个吗?
解决方法
v.size()
返回一个 无符号 值 std::vector::size_type
。这通常是 size_t
。
无符号值中的算术环绕,如果您的 (v.size() - 1)
是 64 位长,则 0xffffffffffffffff
将是 size_t
(18446744073709551615)。
将此值除以 100
得出 0x28F5C28F5C28F5C
(184467440737095516)。
然后,这个结果被转换为int
。如果您的 int
为 32 位长且转换是通过简单截断完成的,则该值将为 0xF5C28F5C
。
这个值代表 -171798692
,它是你得到的,是二进制补码。
问题是v.size() - 1
。
size()
函数返回一个 无符号 值。当您从无符号 1
中减去 0
时,不会得到 -1
而是一个非常大的值。
然后你把这个大的无符号值转换回一个有符号整数类型,它可以把它变成负数。
不仅如此,在 64 位系统上,size()
很可能返回 64 位值,而 int
保持 32 位,这会让您丢失一半数据。
向量 v
是空的,所以 v.size()
是 0。而且 v.size()
是无符号的,所以当你从那个 0 减去时会发生奇怪的事情。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。