C ++无符号长整数插入STL容器并打印回怪异

C++ unsigned long integer insertion into STL container and print back weirdness

对 C++ 数据类型如此陌生,我观察到一些非常奇怪的东西,我在 Internet 上找不到答案:

std::set<unsigned long> test;
test.insert(7788994347298743234);
test.insert(0113);
std::set<unsigned long>::iterator it;
for(it = test.begin(); it != test.end(); it++) {
  std::cout << *it << std::endl;
}

输出:

75

7788994347298743234

这是一个元素类型为"unsigned long int"的集合,范围是0到4,294,967,295。现在为什么:

  1. 像 7788994347298743234 这样的大数字仍然适合集合并打印出来?当您尝试插入一些溢出容器指定类型范围的数据时,C++ 的行为是什么?插入时不拒绝 return false 吗?不过,它的底层使用了比 32 位更多的内存来存储该数据?

  2. 以零开头的数字是否无效?做了什么隐式类型转换让0113变成了75?

我问这些是因为如果我的集合需要存储可能具有任意前导零的元素,比如说 CRC32 哈希的结果(好吧,这里只是举个例子,不知道这是否真的适用......) ?谢谢!

好吧,看起来是重复的。如果管理员认为合适,请随意删除它。在评论中得到大家的帮助后快速回答自己:

  1. 规范说 unsigned long int 有 "at least 32 bits",这意味着实际范围可能达到 64 位,具体取决于机器和编译器。我正在查看这样的文档:https://msdn.microsoft.com/en-us/library/s3f49ktz%28v=vs.80%29.aspx,它特定于 visual studio 并且回到 2005 年。

  2. 显然在 C++ 中前导零表示八进制数。自从 8 年前上学以来就没有接触过这个概念......评论指出的良好链接: http://en.cppreference.com/w/cpp/language/integer_literal How does C Handle Integer Literals with Leading Zeros, and What About atoi?