假设我有一个向量:
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个字符推入这个变量怎么办?
没问题。只要有可用的内存,就可以将任意多的元素推入向量中。