在无序映射<string,int>中存储大数字(10-12位)

时间:2019-11-25 10:10:10

标签: c++ unordered-map

如何在C ++中将大数字(长10位)存储为键值,作为无序映射中的键的值。我收到此警告-“警告:隐式常量转换[-Woverflow]中的溢出”。对应的所有值键的打印方式与初始化时不同。

2 个答案:

答案 0 :(得分:1)

在典型的现代硬件上,int具有32位,以二进制补码方式允许的值范围为[-2147483648; 2 147 483]。如果您的值不适合此范围,则需要更大的数据类型。

但是请注意,该标准仅保证[-32767; [32767],实际上,存在int 甚至今天仅使用16位的硬件(如果您想知道为什么不这样做-32768:嗯,标准还涵盖了基于补码或符号幅度的体系结构...)。

通常,long也具有32位范围(这是标准的最小范围)(例如,在64位linux上,它具有64位),并且long long至少可保证与64位一样大。 / p>

很混乱,如您所见...如果需要保证范围,最好的办法是使用<cstdint>标头中的数据类型,例如int64_t(或者-如果您不需要, t处理负值-最好是uint64_t)。

还有许多其他有用的类型,例如。 G。 uint_least8_t(至少8位的最小数据类型–如果您编写可移植的代码,并且需要涵盖可能无法提供uint8_t的平台)或uint_fast8_t({至少8位可以在给定平台上最快访问;通常,它比uint8_t大。好奇吗?为什么不读一点further

答案 1 :(得分:-3)

在c ++ int中可以存储这么多

int 4个字节-2147483648至2147483647

long int(或long long)可以存储-9223372036854775808到+9223372036854775807

或者您可以直接使用unsigned long int,它可以存储0到18446744073709551615

为更大的数字,那么您可以尝试增强库或尝试创建一个基于字符串的函数来保存它,并在需要时将其转换为数学运算