处理字符向量的溢出



假设我有一个向量:

std::vector<char>& over;

在代码的某个地方,我有一个输入,可以将数据分配给那个字符向量。我知道一个无符号字符的比特大小是255,所以如果我一次向该字符数组中输入256个字符,程序就会溢出。但是,如果我需要将超过255个字符推入这个变量,该怎么办?由于其他原因,它必须保持为char类型的向量,那么还有什么其他解决方案来处理这个溢出问题呢?

我认为您混淆了这里的概念。存储任何数据类型对象(在本例中为字符(的容器的容量与存储的类型无关。容器将消耗堆中的内存(如果像向量一样动态分配(。因此,容器的最大大小基本上不限于数据类型的最大大小,而是您的可用内存(RAM(。

注意:char对象占用1个字节(即8位(。对于8位,我们可以得到的最大有符号值是127,最大无符号值是255。

您混合了类型溢出和向量大小。

类型溢出意味着:计算结果超出了该类型定义的范围。

示例:https://godbolt.org/z/3o7jqq

#include <iostream>
#include <limits>
int main(int, char**)
{
unsigned char a{std::numeric_limits<unsigned char>::max()};
std::cout<< +a << std::endl;
a+=1; // max value +1, it must be overflowed!
std::cout<< +a << std::endl;
}

这将打印

255 <== It's max value
0   <== the result of overflow.

对于向量大小,它有一个比255大得多的数字。

你可以测试一下。https://godbolt.org/z/1fqdPa

std::vector<unsigned char> v;
std::cout<< v.max_size() << std::endl;

它在联机编译器上打印9223372036854775807

我知道无符号字符的位大小为255,因此如果我一次向该字符数组中输入256个字符,程序将溢出。

你误解了。数组的大小在很大程度上与数组包含的元素的类型无关。该数组可以包含0、255、256或424242个元素。

但是如果我需要将超过255个字符推入这个变量怎么办?

没问题。只要有可用的内存,就可以将任意多的元素推入向量中。

最新更新